riscv: Use vendor name for K210 SoC support
authorDamien Le Moal <damien.lemoal@wdc.com>
Sun, 13 Dec 2020 13:50:38 +0000 (22:50 +0900)
committerPalmer Dabbelt <palmerdabbelt@google.com>
Thu, 14 Jan 2021 23:08:46 +0000 (15:08 -0800)
Rename configuration options and directories related to the Kendryte
K210 SoC to use the SoC vendor name (canaan) instead of the "kendryte"
branding name.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
18 files changed:
arch/riscv/Kconfig.socs
arch/riscv/Makefile
arch/riscv/boot/dts/Makefile
arch/riscv/boot/dts/canaan/Makefile [new file with mode: 0644]
arch/riscv/boot/dts/canaan/k210.dts [new file with mode: 0644]
arch/riscv/boot/dts/canaan/k210.dtsi [new file with mode: 0644]
arch/riscv/boot/dts/kendryte/Makefile [deleted file]
arch/riscv/boot/dts/kendryte/k210.dts [deleted file]
arch/riscv/boot/dts/kendryte/k210.dtsi [deleted file]
arch/riscv/configs/nommu_k210_defconfig
drivers/soc/Kconfig
drivers/soc/Makefile
drivers/soc/canaan/Kconfig [new file with mode: 0644]
drivers/soc/canaan/Makefile [new file with mode: 0644]
drivers/soc/canaan/k210-sysctl.c [new file with mode: 0644]
drivers/soc/kendryte/Kconfig [deleted file]
drivers/soc/kendryte/Makefile [deleted file]
drivers/soc/kendryte/k210-sysctl.c [deleted file]

index 59000675cb9fbe7323b9838a23e4f2c7b1335a79..027042e4d0af4cf999e510b66c2c2e14afb44e20 100644 (file)
@@ -22,21 +22,21 @@ config SOC_VIRT
        help
          This enables support for QEMU Virt Machine.
 
-config SOC_KENDRYTE
-       bool "Kendryte K210 SoC"
+config SOC_CANAAN
+       bool "Canaan Kendryte K210 SoC"
        depends on !MMU
        select CLINT_TIMER if RISCV_M_MODE
        select SERIAL_SIFIVE if TTY
        select SERIAL_SIFIVE_CONSOLE if TTY
        select SIFIVE_PLIC
        help
-         This enables support for Kendryte K210 SoC platform hardware.
+         This enables support for Canaan Kendryte K210 SoC platform hardware.
 
-if SOC_KENDRYTE
+if SOC_CANAAN
 
-config SOC_KENDRYTE_K210_DTB_BUILTIN
-       bool "Builtin device tree for the Kendryte K210"
-       depends on SOC_KENDRYTE
+config SOC_CANAAN_K210_DTB_BUILTIN
+       bool "Builtin device tree for the Canaan Kendryte K210"
+       depends on SOC_CANAAN
        default y
        select OF
        select BUILTIN_DTB
@@ -45,13 +45,13 @@ config SOC_KENDRYTE_K210_DTB_BUILTIN
          This option should be selected if no bootloader is being used.
          If unsure, say Y.
 
-config SOC_KENDRYTE_K210_DTB_SOURCE
-       string "Source file for the Kendryte K210 builtin DTB"
-       depends on SOC_KENDRYTE
-       depends on SOC_KENDRYTE_K210_DTB_BUILTIN
+config SOC_CANAAN_K210_DTB_SOURCE
+       string "Source file for the Canaan Kendryte K210 builtin DTB"
+       depends on SOC_CANAAN
+       depends on SOC_CANAAN_K210_DTB_BUILTIN
        default "k210"
        help
-         Base name (without suffix, relative to arch/riscv/boot/dts/kendryte)
+         Base name (without suffix, relative to arch/riscv/boot/dts/canaan)
          for the DTS file that will be used to produce the DTB linked into the
          kernel.
 
index 8c29e553ef7fd945a13b80a11e69b9f98d4ab932..597b58b2d4c0b7172d5670626f211172af0e250b 100644 (file)
@@ -83,7 +83,7 @@ PHONY += vdso_install
 vdso_install:
        $(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@
 
-ifeq ($(CONFIG_RISCV_M_MODE)$(CONFIG_SOC_KENDRYTE),yy)
+ifeq ($(CONFIG_RISCV_M_MODE)$(CONFIG_SOC_CANAAN),yy)
 KBUILD_IMAGE := $(boot)/loader.bin
 else
 KBUILD_IMAGE := $(boot)/Image.gz
index 21e3905f1c4468d7a267e03ea2020761182fe3c2..7ffd502e3e7b9d5ea5a1a78dc796748155c8f49f 100644 (file)
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 subdir-y += sifive
-subdir-$(CONFIG_SOC_KENDRYTE) += kendryte
+subdir-$(CONFIG_SOC_CANAAN_K210_DTB_BUILTIN) += canaan
 
 obj-$(CONFIG_BUILTIN_DTB) := $(addsuffix /, $(subdir-y))
diff --git a/arch/riscv/boot/dts/canaan/Makefile b/arch/riscv/boot/dts/canaan/Makefile
new file mode 100644 (file)
index 0000000..9ee7156
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0
+ifneq ($(CONFIG_SOC_CANAAN_K210_DTB_SOURCE),"")
+dtb-y += $(strip $(shell echo $(CONFIG_SOC_CANAAN_K210_DTB_SOURCE))).dtb
+obj-$(CONFIG_SOC_CANAAN_K210_DTB_BUILTIN) += $(addsuffix .o, $(dtb-y))
+endif
diff --git a/arch/riscv/boot/dts/canaan/k210.dts b/arch/riscv/boot/dts/canaan/k210.dts
new file mode 100644 (file)
index 0000000..0d1f28f
--- /dev/null
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Western Digital Corporation or its affiliates.
+ */
+
+/dts-v1/;
+
+#include "k210.dtsi"
+
+/ {
+       model = "Kendryte K210 generic";
+       compatible = "kendryte,k210";
+
+       chosen {
+               bootargs = "earlycon console=ttySIF0";
+               stdout-path = "serial0";
+       };
+};
+
+&uarths0 {
+       status = "okay";
+};
+
diff --git a/arch/riscv/boot/dts/canaan/k210.dtsi b/arch/riscv/boot/dts/canaan/k210.dtsi
new file mode 100644 (file)
index 0000000..d2d0ff6
--- /dev/null
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
+ * Copyright (C) 2020 Western Digital Corporation or its affiliates.
+ */
+#include <dt-bindings/clock/k210-clk.h>
+
+/ {
+       /*
+        * Although the K210 is a 64-bit CPU, the address bus is only 32-bits
+        * wide, and the upper half of all addresses is ignored.
+        */
+       #address-cells = <1>;
+       #size-cells = <1>;
+       compatible = "kendryte,k210";
+
+       aliases {
+               serial0 = &uarths0;
+       };
+
+       /*
+        * The K210 has an sv39 MMU following the priviledge specification v1.9.
+        * Since this is a non-ratified draft specification, the kernel does not
+        * support it and the K210 support enabled only for the !MMU case.
+        * Be consistent with this by setting the CPUs MMU type to "none".
+        */
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               timebase-frequency = <7800000>;
+               cpu0: cpu@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       compatible = "kendryte,k210", "sifive,rocket0", "riscv";
+                       riscv,isa = "rv64imafdc";
+                       mmu-type = "none";
+                       i-cache-size = <0x8000>;
+                       i-cache-block-size = <64>;
+                       d-cache-size = <0x8000>;
+                       d-cache-block-size = <64>;
+                       clocks = <&sysctl K210_CLK_CPU>;
+                       clock-frequency = <390000000>;
+                       cpu0_intc: interrupt-controller {
+                               #interrupt-cells = <1>;
+                               interrupt-controller;
+                               compatible = "riscv,cpu-intc";
+                       };
+               };
+               cpu1: cpu@1 {
+                       device_type = "cpu";
+                       reg = <1>;
+                       compatible = "kendryte,k210", "sifive,rocket0", "riscv";
+                       riscv,isa = "rv64imafdc";
+                       mmu-type = "none";
+                       i-cache-size = <0x8000>;
+                       i-cache-block-size = <64>;
+                       d-cache-size = <0x8000>;
+                       d-cache-block-size = <64>;
+                       clocks = <&sysctl K210_CLK_CPU>;
+                       clock-frequency = <390000000>;
+                       cpu1_intc: interrupt-controller {
+                               #interrupt-cells = <1>;
+                               interrupt-controller;
+                               compatible = "riscv,cpu-intc";
+                       };
+               };
+       };
+
+       sram: memory@80000000 {
+               device_type = "memory";
+               reg = <0x80000000 0x400000>,
+                     <0x80400000 0x200000>,
+                     <0x80600000 0x200000>;
+               reg-names = "sram0", "sram1", "aisram";
+       };
+
+       clocks {
+               in0: oscillator {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <26000000>;
+               };
+       };
+
+       soc {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "kendryte,k210-soc", "simple-bus";
+               ranges;
+               interrupt-parent = <&plic0>;
+
+               sysctl: sysctl@50440000 {
+                       compatible = "kendryte,k210-sysctl", "simple-mfd";
+                       reg = <0x50440000 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               clint0: clint@2000000 {
+                       #interrupt-cells = <1>;
+                       compatible = "riscv,clint0";
+                       reg = <0x2000000 0xC000>;
+                       interrupts-extended =  <&cpu0_intc 3 &cpu0_intc 7
+                                               &cpu1_intc 3 &cpu1_intc 7>;
+                       clocks = <&sysctl K210_CLK_ACLK>;
+               };
+
+               plic0: interrupt-controller@c000000 {
+                       #interrupt-cells = <1>;
+                       interrupt-controller;
+                       compatible = "kendryte,k210-plic0", "riscv,plic0";
+                       reg = <0xC000000 0x4000000>;
+                       interrupts-extended = <&cpu0_intc 11>, <&cpu0_intc 0xffffffff>,
+                                             <&cpu1_intc 11>, <&cpu1_intc 0xffffffff>;
+                       riscv,ndev = <65>;
+                       riscv,max-priority = <7>;
+               };
+
+               uarths0: serial@38000000 {
+                       compatible = "kendryte,k210-uarths", "sifive,uart0";
+                       reg = <0x38000000 0x1000>;
+                       interrupts = <33>;
+                       clocks = <&sysctl K210_CLK_CPU>;
+               };
+       };
+};
diff --git a/arch/riscv/boot/dts/kendryte/Makefile b/arch/riscv/boot/dts/kendryte/Makefile
deleted file mode 100644 (file)
index 8363669..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-ifneq ($(CONFIG_SOC_KENDRYTE_K210_DTB_SOURCE),"")
-dtb-y += $(strip $(shell echo $(CONFIG_SOC_KENDRYTE_K210_DTB_SOURCE))).dtb
-obj-$(CONFIG_SOC_KENDRYTE_K210_DTB_BUILTIN) += $(addsuffix .o, $(dtb-y))
-endif
diff --git a/arch/riscv/boot/dts/kendryte/k210.dts b/arch/riscv/boot/dts/kendryte/k210.dts
deleted file mode 100644 (file)
index 0d1f28f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright (C) 2020 Western Digital Corporation or its affiliates.
- */
-
-/dts-v1/;
-
-#include "k210.dtsi"
-
-/ {
-       model = "Kendryte K210 generic";
-       compatible = "kendryte,k210";
-
-       chosen {
-               bootargs = "earlycon console=ttySIF0";
-               stdout-path = "serial0";
-       };
-};
-
-&uarths0 {
-       status = "okay";
-};
-
diff --git a/arch/riscv/boot/dts/kendryte/k210.dtsi b/arch/riscv/boot/dts/kendryte/k210.dtsi
deleted file mode 100644 (file)
index d2d0ff6..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
- * Copyright (C) 2020 Western Digital Corporation or its affiliates.
- */
-#include <dt-bindings/clock/k210-clk.h>
-
-/ {
-       /*
-        * Although the K210 is a 64-bit CPU, the address bus is only 32-bits
-        * wide, and the upper half of all addresses is ignored.
-        */
-       #address-cells = <1>;
-       #size-cells = <1>;
-       compatible = "kendryte,k210";
-
-       aliases {
-               serial0 = &uarths0;
-       };
-
-       /*
-        * The K210 has an sv39 MMU following the priviledge specification v1.9.
-        * Since this is a non-ratified draft specification, the kernel does not
-        * support it and the K210 support enabled only for the !MMU case.
-        * Be consistent with this by setting the CPUs MMU type to "none".
-        */
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               timebase-frequency = <7800000>;
-               cpu0: cpu@0 {
-                       device_type = "cpu";
-                       reg = <0>;
-                       compatible = "kendryte,k210", "sifive,rocket0", "riscv";
-                       riscv,isa = "rv64imafdc";
-                       mmu-type = "none";
-                       i-cache-size = <0x8000>;
-                       i-cache-block-size = <64>;
-                       d-cache-size = <0x8000>;
-                       d-cache-block-size = <64>;
-                       clocks = <&sysctl K210_CLK_CPU>;
-                       clock-frequency = <390000000>;
-                       cpu0_intc: interrupt-controller {
-                               #interrupt-cells = <1>;
-                               interrupt-controller;
-                               compatible = "riscv,cpu-intc";
-                       };
-               };
-               cpu1: cpu@1 {
-                       device_type = "cpu";
-                       reg = <1>;
-                       compatible = "kendryte,k210", "sifive,rocket0", "riscv";
-                       riscv,isa = "rv64imafdc";
-                       mmu-type = "none";
-                       i-cache-size = <0x8000>;
-                       i-cache-block-size = <64>;
-                       d-cache-size = <0x8000>;
-                       d-cache-block-size = <64>;
-                       clocks = <&sysctl K210_CLK_CPU>;
-                       clock-frequency = <390000000>;
-                       cpu1_intc: interrupt-controller {
-                               #interrupt-cells = <1>;
-                               interrupt-controller;
-                               compatible = "riscv,cpu-intc";
-                       };
-               };
-       };
-
-       sram: memory@80000000 {
-               device_type = "memory";
-               reg = <0x80000000 0x400000>,
-                     <0x80400000 0x200000>,
-                     <0x80600000 0x200000>;
-               reg-names = "sram0", "sram1", "aisram";
-       };
-
-       clocks {
-               in0: oscillator {
-                       compatible = "fixed-clock";
-                       #clock-cells = <0>;
-                       clock-frequency = <26000000>;
-               };
-       };
-
-       soc {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               compatible = "kendryte,k210-soc", "simple-bus";
-               ranges;
-               interrupt-parent = <&plic0>;
-
-               sysctl: sysctl@50440000 {
-                       compatible = "kendryte,k210-sysctl", "simple-mfd";
-                       reg = <0x50440000 0x1000>;
-                       #clock-cells = <1>;
-               };
-
-               clint0: clint@2000000 {
-                       #interrupt-cells = <1>;
-                       compatible = "riscv,clint0";
-                       reg = <0x2000000 0xC000>;
-                       interrupts-extended =  <&cpu0_intc 3 &cpu0_intc 7
-                                               &cpu1_intc 3 &cpu1_intc 7>;
-                       clocks = <&sysctl K210_CLK_ACLK>;
-               };
-
-               plic0: interrupt-controller@c000000 {
-                       #interrupt-cells = <1>;
-                       interrupt-controller;
-                       compatible = "kendryte,k210-plic0", "riscv,plic0";
-                       reg = <0xC000000 0x4000000>;
-                       interrupts-extended = <&cpu0_intc 11>, <&cpu0_intc 0xffffffff>,
-                                             <&cpu1_intc 11>, <&cpu1_intc 0xffffffff>;
-                       riscv,ndev = <65>;
-                       riscv,max-priority = <7>;
-               };
-
-               uarths0: serial@38000000 {
-                       compatible = "kendryte,k210-uarths", "sifive,uart0";
-                       reg = <0x38000000 0x1000>;
-                       interrupts = <33>;
-                       clocks = <&sysctl K210_CLK_CPU>;
-               };
-       };
-};
index cd1df62b13c7271789d917fa3159d8a4ebe7721e..368a28cf1467ece682626bc5faa67d127ba603ff 100644 (file)
@@ -27,7 +27,7 @@ CONFIG_EMBEDDED=y
 CONFIG_SLOB=y
 # CONFIG_SLAB_MERGE_DEFAULT is not set
 # CONFIG_MMU is not set
-CONFIG_SOC_KENDRYTE=y
+CONFIG_SOC_CANAAN=y
 CONFIG_MAXPHYSMEM_2GB=y
 CONFIG_SMP=y
 CONFIG_NR_CPUS=2
index d097d070f579079759649e50e3ce9e3e17e49dde..c0143651f4a94d70b69acfa844809ea78842aebb 100644 (file)
@@ -6,6 +6,7 @@ source "drivers/soc/amlogic/Kconfig"
 source "drivers/soc/aspeed/Kconfig"
 source "drivers/soc/atmel/Kconfig"
 source "drivers/soc/bcm/Kconfig"
+source "drivers/soc/canaan/Kconfig"
 source "drivers/soc/fsl/Kconfig"
 source "drivers/soc/imx/Kconfig"
 source "drivers/soc/ixp4xx/Kconfig"
@@ -23,6 +24,5 @@ source "drivers/soc/ux500/Kconfig"
 source "drivers/soc/versatile/Kconfig"
 source "drivers/soc/xilinx/Kconfig"
 source "drivers/soc/zte/Kconfig"
-source "drivers/soc/kendryte/Kconfig"
 
 endmenu
index 699b758d28e4f31934d73c23f8f77eed034f0d6e..fa707124654672f3b77e4ea4365267b94f044986 100644 (file)
@@ -29,4 +29,4 @@ obj-$(CONFIG_ARCH_U8500)      += ux500/
 obj-$(CONFIG_PLAT_VERSATILE)   += versatile/
 obj-y                          += xilinx/
 obj-$(CONFIG_ARCH_ZX)          += zte/
-obj-$(CONFIG_SOC_KENDRYTE)     += kendryte/
+obj-$(CONFIG_SOC_CANAAN)       += canaan/
diff --git a/drivers/soc/canaan/Kconfig b/drivers/soc/canaan/Kconfig
new file mode 100644 (file)
index 0000000..5232d13
--- /dev/null
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0
+
+if SOC_CANAAN
+
+config K210_SYSCTL
+       bool "Canaan Kendryte K210 SoC system controller"
+       default y
+       depends on RISCV
+       help
+         Enables controlling the K210 various clocks and to enable
+         general purpose use of the extra 2MB of SRAM normally
+         reserved for the AI engine.
+
+endif
diff --git a/drivers/soc/canaan/Makefile b/drivers/soc/canaan/Makefile
new file mode 100644 (file)
index 0000000..002d9ce
--- /dev/null
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_K210_SYSCTL)      += k210-sysctl.o
diff --git a/drivers/soc/canaan/k210-sysctl.c b/drivers/soc/canaan/k210-sysctl.c
new file mode 100644 (file)
index 0000000..4608fbc
--- /dev/null
@@ -0,0 +1,248 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019 Christoph Hellwig.
+ * Copyright (c) 2019 Western Digital Corporation or its affiliates.
+ */
+#include <linux/types.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <linux/bitfield.h>
+#include <asm/soc.h>
+
+#define K210_SYSCTL_CLK0_FREQ          26000000UL
+
+/* Registers base address */
+#define K210_SYSCTL_SYSCTL_BASE_ADDR   0x50440000ULL
+
+/* Registers */
+#define K210_SYSCTL_PLL0               0x08
+#define K210_SYSCTL_PLL1               0x0c
+/* clkr: 4bits, clkf1: 6bits, clkod: 4bits, bwadj: 4bits */
+#define   PLL_RESET            (1 << 20)
+#define   PLL_PWR              (1 << 21)
+#define   PLL_INTFB            (1 << 22)
+#define   PLL_BYPASS           (1 << 23)
+#define   PLL_TEST             (1 << 24)
+#define   PLL_OUT_EN           (1 << 25)
+#define   PLL_TEST_EN          (1 << 26)
+#define K210_SYSCTL_PLL_LOCK           0x18
+#define   PLL0_LOCK1           (1 << 0)
+#define   PLL0_LOCK2           (1 << 1)
+#define   PLL0_SLIP_CLEAR      (1 << 2)
+#define   PLL0_TEST_CLK_OUT    (1 << 3)
+#define   PLL1_LOCK1           (1 << 8)
+#define   PLL1_LOCK2           (1 << 9)
+#define   PLL1_SLIP_CLEAR      (1 << 10)
+#define   PLL1_TEST_CLK_OUT    (1 << 11)
+#define   PLL2_LOCK1           (1 << 16)
+#define   PLL2_LOCK2           (1 << 16)
+#define   PLL2_SLIP_CLEAR      (1 << 18)
+#define   PLL2_TEST_CLK_OUT    (1 << 19)
+#define K210_SYSCTL_CLKSEL0    0x20
+#define   CLKSEL_ACLK          (1 << 0)
+#define K210_SYSCTL_CLKEN_CENT         0x28
+#define   CLKEN_CPU            (1 << 0)
+#define   CLKEN_SRAM0          (1 << 1)
+#define   CLKEN_SRAM1          (1 << 2)
+#define   CLKEN_APB0           (1 << 3)
+#define   CLKEN_APB1           (1 << 4)
+#define   CLKEN_APB2           (1 << 5)
+#define K210_SYSCTL_CLKEN_PERI         0x2c
+#define   CLKEN_ROM            (1 << 0)
+#define   CLKEN_DMA            (1 << 1)
+#define   CLKEN_AI             (1 << 2)
+#define   CLKEN_DVP            (1 << 3)
+#define   CLKEN_FFT            (1 << 4)
+#define   CLKEN_GPIO           (1 << 5)
+#define   CLKEN_SPI0           (1 << 6)
+#define   CLKEN_SPI1           (1 << 7)
+#define   CLKEN_SPI2           (1 << 8)
+#define   CLKEN_SPI3           (1 << 9)
+#define   CLKEN_I2S0           (1 << 10)
+#define   CLKEN_I2S1           (1 << 11)
+#define   CLKEN_I2S2           (1 << 12)
+#define   CLKEN_I2C0           (1 << 13)
+#define   CLKEN_I2C1           (1 << 14)
+#define   CLKEN_I2C2           (1 << 15)
+#define   CLKEN_UART1          (1 << 16)
+#define   CLKEN_UART2          (1 << 17)
+#define   CLKEN_UART3          (1 << 18)
+#define   CLKEN_AES            (1 << 19)
+#define   CLKEN_FPIO           (1 << 20)
+#define   CLKEN_TIMER0         (1 << 21)
+#define   CLKEN_TIMER1         (1 << 22)
+#define   CLKEN_TIMER2         (1 << 23)
+#define   CLKEN_WDT0           (1 << 24)
+#define   CLKEN_WDT1           (1 << 25)
+#define   CLKEN_SHA            (1 << 26)
+#define   CLKEN_OTP            (1 << 27)
+#define   CLKEN_RTC            (1 << 29)
+
+struct k210_sysctl {
+       void __iomem            *regs;
+       struct clk_hw           hw;
+};
+
+static void k210_set_bits(u32 val, void __iomem *reg)
+{
+       writel(readl(reg) | val, reg);
+}
+
+static void k210_clear_bits(u32 val, void __iomem *reg)
+{
+       writel(readl(reg) & ~val, reg);
+}
+
+static void k210_pll1_enable(void __iomem *regs)
+{
+       u32 val;
+
+       val = readl(regs + K210_SYSCTL_PLL1);
+       val &= ~GENMASK(19, 0);                         /* clkr1 = 0 */
+       val |= FIELD_PREP(GENMASK(9, 4), 0x3B);         /* clkf1 = 59 */
+       val |= FIELD_PREP(GENMASK(13, 10), 0x3);        /* clkod1 = 3 */
+       val |= FIELD_PREP(GENMASK(19, 14), 0x3B);       /* bwadj1 = 59 */
+       writel(val, regs + K210_SYSCTL_PLL1);
+
+       k210_clear_bits(PLL_BYPASS, regs + K210_SYSCTL_PLL1);
+       k210_set_bits(PLL_PWR, regs + K210_SYSCTL_PLL1);
+
+       /*
+        * Reset the pll. The magic NOPs come from the Kendryte reference SDK.
+        */
+       k210_clear_bits(PLL_RESET, regs + K210_SYSCTL_PLL1);
+       k210_set_bits(PLL_RESET, regs + K210_SYSCTL_PLL1);
+       nop();
+       nop();
+       k210_clear_bits(PLL_RESET, regs + K210_SYSCTL_PLL1);
+
+       for (;;) {
+               val = readl(regs + K210_SYSCTL_PLL_LOCK);
+               if (val & PLL1_LOCK2)
+                       break;
+               writel(val | PLL1_SLIP_CLEAR, regs + K210_SYSCTL_PLL_LOCK);
+       }
+
+       k210_set_bits(PLL_OUT_EN, regs + K210_SYSCTL_PLL1);
+}
+
+static unsigned long k210_sysctl_clk_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct k210_sysctl *s = container_of(hw, struct k210_sysctl, hw);
+       u32 clksel0, pll0;
+       u64 pll0_freq, clkr0, clkf0, clkod0;
+
+       /*
+        * If the clock selector is not set, use the base frequency.
+        * Otherwise, use PLL0 frequency with a frequency divisor.
+        */
+       clksel0 = readl(s->regs + K210_SYSCTL_CLKSEL0);
+       if (!(clksel0 & CLKSEL_ACLK))
+               return K210_SYSCTL_CLK0_FREQ;
+
+       /*
+        * Get PLL0 frequency:
+        * freq = base frequency * clkf0 / (clkr0 * clkod0)
+        */
+       pll0 = readl(s->regs + K210_SYSCTL_PLL0);
+       clkr0 = 1 + FIELD_GET(GENMASK(3, 0), pll0);
+       clkf0 = 1 + FIELD_GET(GENMASK(9, 4), pll0);
+       clkod0 = 1 + FIELD_GET(GENMASK(13, 10), pll0);
+       pll0_freq = clkf0 * K210_SYSCTL_CLK0_FREQ / (clkr0 * clkod0);
+
+       /* Get the frequency divisor from the clock selector */
+       return pll0_freq / (2ULL << FIELD_GET(0x00000006, clksel0));
+}
+
+static const struct clk_ops k210_sysctl_clk_ops = {
+       .recalc_rate    = k210_sysctl_clk_recalc_rate,
+};
+
+static const struct clk_init_data k210_clk_init_data = {
+       .name           = "k210-sysctl-pll1",
+       .ops            = &k210_sysctl_clk_ops,
+};
+
+static int k210_sysctl_probe(struct platform_device *pdev)
+{
+       struct k210_sysctl *s;
+       int error;
+
+       pr_info("Kendryte K210 SoC sysctl\n");
+
+       s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL);
+       if (!s)
+               return -ENOMEM;
+
+       s->regs = devm_ioremap_resource(&pdev->dev,
+                       platform_get_resource(pdev, IORESOURCE_MEM, 0));
+       if (IS_ERR(s->regs))
+               return PTR_ERR(s->regs);
+
+       s->hw.init = &k210_clk_init_data;
+       error = devm_clk_hw_register(&pdev->dev, &s->hw);
+       if (error) {
+               dev_err(&pdev->dev, "failed to register clk");
+               return error;
+       }
+
+       error = devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_simple_get,
+                                           &s->hw);
+       if (error) {
+               dev_err(&pdev->dev, "adding clk provider failed\n");
+               return error;
+       }
+
+       return 0;
+}
+
+static const struct of_device_id k210_sysctl_of_match[] = {
+       { .compatible = "kendryte,k210-sysctl", },
+       {}
+};
+
+static struct platform_driver k210_sysctl_driver = {
+       .driver = {
+               .name           = "k210-sysctl",
+               .of_match_table = k210_sysctl_of_match,
+       },
+       .probe                  = k210_sysctl_probe,
+};
+
+static int __init k210_sysctl_init(void)
+{
+       return platform_driver_register(&k210_sysctl_driver);
+}
+core_initcall(k210_sysctl_init);
+
+/*
+ * This needs to be called very early during initialization, given that
+ * PLL1 needs to be enabled to be able to use all SRAM.
+ */
+static void __init k210_soc_early_init(const void *fdt)
+{
+       void __iomem *regs;
+
+       regs = ioremap(K210_SYSCTL_SYSCTL_BASE_ADDR, 0x1000);
+       if (!regs)
+               panic("K210 sysctl ioremap");
+
+       /* Enable PLL1 to make the KPU SRAM useable */
+       k210_pll1_enable(regs);
+
+       k210_set_bits(PLL_OUT_EN, regs + K210_SYSCTL_PLL0);
+
+       k210_set_bits(CLKEN_CPU | CLKEN_SRAM0 | CLKEN_SRAM1,
+                     regs + K210_SYSCTL_CLKEN_CENT);
+       k210_set_bits(CLKEN_ROM | CLKEN_TIMER0 | CLKEN_RTC,
+                     regs + K210_SYSCTL_CLKEN_PERI);
+
+       k210_set_bits(CLKSEL_ACLK, regs + K210_SYSCTL_CLKSEL0);
+
+       iounmap(regs);
+}
+SOC_EARLY_INIT_DECLARE(generic_k210, "kendryte,k210", k210_soc_early_init);
diff --git a/drivers/soc/kendryte/Kconfig b/drivers/soc/kendryte/Kconfig
deleted file mode 100644 (file)
index 49785b1..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-
-if SOC_KENDRYTE
-
-config K210_SYSCTL
-       bool "Kendryte K210 system controller"
-       default y
-       depends on RISCV
-       help
-         Enables controlling the K210 various clocks and to enable
-         general purpose use of the extra 2MB of SRAM normally
-         reserved for the AI engine.
-
-endif
diff --git a/drivers/soc/kendryte/Makefile b/drivers/soc/kendryte/Makefile
deleted file mode 100644 (file)
index 002d9ce..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-
-obj-$(CONFIG_K210_SYSCTL)      += k210-sysctl.o
diff --git a/drivers/soc/kendryte/k210-sysctl.c b/drivers/soc/kendryte/k210-sysctl.c
deleted file mode 100644 (file)
index 4608fbc..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Copyright (c) 2019 Christoph Hellwig.
- * Copyright (c) 2019 Western Digital Corporation or its affiliates.
- */
-#include <linux/types.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/clk-provider.h>
-#include <linux/clkdev.h>
-#include <linux/bitfield.h>
-#include <asm/soc.h>
-
-#define K210_SYSCTL_CLK0_FREQ          26000000UL
-
-/* Registers base address */
-#define K210_SYSCTL_SYSCTL_BASE_ADDR   0x50440000ULL
-
-/* Registers */
-#define K210_SYSCTL_PLL0               0x08
-#define K210_SYSCTL_PLL1               0x0c
-/* clkr: 4bits, clkf1: 6bits, clkod: 4bits, bwadj: 4bits */
-#define   PLL_RESET            (1 << 20)
-#define   PLL_PWR              (1 << 21)
-#define   PLL_INTFB            (1 << 22)
-#define   PLL_BYPASS           (1 << 23)
-#define   PLL_TEST             (1 << 24)
-#define   PLL_OUT_EN           (1 << 25)
-#define   PLL_TEST_EN          (1 << 26)
-#define K210_SYSCTL_PLL_LOCK           0x18
-#define   PLL0_LOCK1           (1 << 0)
-#define   PLL0_LOCK2           (1 << 1)
-#define   PLL0_SLIP_CLEAR      (1 << 2)
-#define   PLL0_TEST_CLK_OUT    (1 << 3)
-#define   PLL1_LOCK1           (1 << 8)
-#define   PLL1_LOCK2           (1 << 9)
-#define   PLL1_SLIP_CLEAR      (1 << 10)
-#define   PLL1_TEST_CLK_OUT    (1 << 11)
-#define   PLL2_LOCK1           (1 << 16)
-#define   PLL2_LOCK2           (1 << 16)
-#define   PLL2_SLIP_CLEAR      (1 << 18)
-#define   PLL2_TEST_CLK_OUT    (1 << 19)
-#define K210_SYSCTL_CLKSEL0    0x20
-#define   CLKSEL_ACLK          (1 << 0)
-#define K210_SYSCTL_CLKEN_CENT         0x28
-#define   CLKEN_CPU            (1 << 0)
-#define   CLKEN_SRAM0          (1 << 1)
-#define   CLKEN_SRAM1          (1 << 2)
-#define   CLKEN_APB0           (1 << 3)
-#define   CLKEN_APB1           (1 << 4)
-#define   CLKEN_APB2           (1 << 5)
-#define K210_SYSCTL_CLKEN_PERI         0x2c
-#define   CLKEN_ROM            (1 << 0)
-#define   CLKEN_DMA            (1 << 1)
-#define   CLKEN_AI             (1 << 2)
-#define   CLKEN_DVP            (1 << 3)
-#define   CLKEN_FFT            (1 << 4)
-#define   CLKEN_GPIO           (1 << 5)
-#define   CLKEN_SPI0           (1 << 6)
-#define   CLKEN_SPI1           (1 << 7)
-#define   CLKEN_SPI2           (1 << 8)
-#define   CLKEN_SPI3           (1 << 9)
-#define   CLKEN_I2S0           (1 << 10)
-#define   CLKEN_I2S1           (1 << 11)
-#define   CLKEN_I2S2           (1 << 12)
-#define   CLKEN_I2C0           (1 << 13)
-#define   CLKEN_I2C1           (1 << 14)
-#define   CLKEN_I2C2           (1 << 15)
-#define   CLKEN_UART1          (1 << 16)
-#define   CLKEN_UART2          (1 << 17)
-#define   CLKEN_UART3          (1 << 18)
-#define   CLKEN_AES            (1 << 19)
-#define   CLKEN_FPIO           (1 << 20)
-#define   CLKEN_TIMER0         (1 << 21)
-#define   CLKEN_TIMER1         (1 << 22)
-#define   CLKEN_TIMER2         (1 << 23)
-#define   CLKEN_WDT0           (1 << 24)
-#define   CLKEN_WDT1           (1 << 25)
-#define   CLKEN_SHA            (1 << 26)
-#define   CLKEN_OTP            (1 << 27)
-#define   CLKEN_RTC            (1 << 29)
-
-struct k210_sysctl {
-       void __iomem            *regs;
-       struct clk_hw           hw;
-};
-
-static void k210_set_bits(u32 val, void __iomem *reg)
-{
-       writel(readl(reg) | val, reg);
-}
-
-static void k210_clear_bits(u32 val, void __iomem *reg)
-{
-       writel(readl(reg) & ~val, reg);
-}
-
-static void k210_pll1_enable(void __iomem *regs)
-{
-       u32 val;
-
-       val = readl(regs + K210_SYSCTL_PLL1);
-       val &= ~GENMASK(19, 0);                         /* clkr1 = 0 */
-       val |= FIELD_PREP(GENMASK(9, 4), 0x3B);         /* clkf1 = 59 */
-       val |= FIELD_PREP(GENMASK(13, 10), 0x3);        /* clkod1 = 3 */
-       val |= FIELD_PREP(GENMASK(19, 14), 0x3B);       /* bwadj1 = 59 */
-       writel(val, regs + K210_SYSCTL_PLL1);
-
-       k210_clear_bits(PLL_BYPASS, regs + K210_SYSCTL_PLL1);
-       k210_set_bits(PLL_PWR, regs + K210_SYSCTL_PLL1);
-
-       /*
-        * Reset the pll. The magic NOPs come from the Kendryte reference SDK.
-        */
-       k210_clear_bits(PLL_RESET, regs + K210_SYSCTL_PLL1);
-       k210_set_bits(PLL_RESET, regs + K210_SYSCTL_PLL1);
-       nop();
-       nop();
-       k210_clear_bits(PLL_RESET, regs + K210_SYSCTL_PLL1);
-
-       for (;;) {
-               val = readl(regs + K210_SYSCTL_PLL_LOCK);
-               if (val & PLL1_LOCK2)
-                       break;
-               writel(val | PLL1_SLIP_CLEAR, regs + K210_SYSCTL_PLL_LOCK);
-       }
-
-       k210_set_bits(PLL_OUT_EN, regs + K210_SYSCTL_PLL1);
-}
-
-static unsigned long k210_sysctl_clk_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct k210_sysctl *s = container_of(hw, struct k210_sysctl, hw);
-       u32 clksel0, pll0;
-       u64 pll0_freq, clkr0, clkf0, clkod0;
-
-       /*
-        * If the clock selector is not set, use the base frequency.
-        * Otherwise, use PLL0 frequency with a frequency divisor.
-        */
-       clksel0 = readl(s->regs + K210_SYSCTL_CLKSEL0);
-       if (!(clksel0 & CLKSEL_ACLK))
-               return K210_SYSCTL_CLK0_FREQ;
-
-       /*
-        * Get PLL0 frequency:
-        * freq = base frequency * clkf0 / (clkr0 * clkod0)
-        */
-       pll0 = readl(s->regs + K210_SYSCTL_PLL0);
-       clkr0 = 1 + FIELD_GET(GENMASK(3, 0), pll0);
-       clkf0 = 1 + FIELD_GET(GENMASK(9, 4), pll0);
-       clkod0 = 1 + FIELD_GET(GENMASK(13, 10), pll0);
-       pll0_freq = clkf0 * K210_SYSCTL_CLK0_FREQ / (clkr0 * clkod0);
-
-       /* Get the frequency divisor from the clock selector */
-       return pll0_freq / (2ULL << FIELD_GET(0x00000006, clksel0));
-}
-
-static const struct clk_ops k210_sysctl_clk_ops = {
-       .recalc_rate    = k210_sysctl_clk_recalc_rate,
-};
-
-static const struct clk_init_data k210_clk_init_data = {
-       .name           = "k210-sysctl-pll1",
-       .ops            = &k210_sysctl_clk_ops,
-};
-
-static int k210_sysctl_probe(struct platform_device *pdev)
-{
-       struct k210_sysctl *s;
-       int error;
-
-       pr_info("Kendryte K210 SoC sysctl\n");
-
-       s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL);
-       if (!s)
-               return -ENOMEM;
-
-       s->regs = devm_ioremap_resource(&pdev->dev,
-                       platform_get_resource(pdev, IORESOURCE_MEM, 0));
-       if (IS_ERR(s->regs))
-               return PTR_ERR(s->regs);
-
-       s->hw.init = &k210_clk_init_data;
-       error = devm_clk_hw_register(&pdev->dev, &s->hw);
-       if (error) {
-               dev_err(&pdev->dev, "failed to register clk");
-               return error;
-       }
-
-       error = devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_simple_get,
-                                           &s->hw);
-       if (error) {
-               dev_err(&pdev->dev, "adding clk provider failed\n");
-               return error;
-       }
-
-       return 0;
-}
-
-static const struct of_device_id k210_sysctl_of_match[] = {
-       { .compatible = "kendryte,k210-sysctl", },
-       {}
-};
-
-static struct platform_driver k210_sysctl_driver = {
-       .driver = {
-               .name           = "k210-sysctl",
-               .of_match_table = k210_sysctl_of_match,
-       },
-       .probe                  = k210_sysctl_probe,
-};
-
-static int __init k210_sysctl_init(void)
-{
-       return platform_driver_register(&k210_sysctl_driver);
-}
-core_initcall(k210_sysctl_init);
-
-/*
- * This needs to be called very early during initialization, given that
- * PLL1 needs to be enabled to be able to use all SRAM.
- */
-static void __init k210_soc_early_init(const void *fdt)
-{
-       void __iomem *regs;
-
-       regs = ioremap(K210_SYSCTL_SYSCTL_BASE_ADDR, 0x1000);
-       if (!regs)
-               panic("K210 sysctl ioremap");
-
-       /* Enable PLL1 to make the KPU SRAM useable */
-       k210_pll1_enable(regs);
-
-       k210_set_bits(PLL_OUT_EN, regs + K210_SYSCTL_PLL0);
-
-       k210_set_bits(CLKEN_CPU | CLKEN_SRAM0 | CLKEN_SRAM1,
-                     regs + K210_SYSCTL_CLKEN_CENT);
-       k210_set_bits(CLKEN_ROM | CLKEN_TIMER0 | CLKEN_RTC,
-                     regs + K210_SYSCTL_CLKEN_PERI);
-
-       k210_set_bits(CLKSEL_ACLK, regs + K210_SYSCTL_CLKSEL0);
-
-       iounmap(regs);
-}
-SOC_EARLY_INIT_DECLARE(generic_k210, "kendryte,k210", k210_soc_early_init);