diff mbox series

[v3,11/12] riscv: Add device tree for K210

Message ID 8c29e4d8-430b-e232-9a0e-27642bfea219@gmail.com
State Superseded
Delegated to: Andes
Headers show
Series riscv: Add Sipeed Maix support | expand

Commit Message

Sean Anderson Feb. 2, 2020, 8:10 p.m. UTC
Where possible, I have tried to find compatible drivers based on the layout of
registers. However, I have not tested most of this functionality, and most
devices should be considered descriptive at best. I would appreciate if anyone
could help identify possibly compatible devices, especially for the timers
and rtc.

Should the size of a reg be the size of the documented registers, or the size
of the address space which will be routed to that device?

Signed-off-by: Sean Anderson <seanga2@gmail.com>
---
  Changes for v3:
  - Move this patch to the end of the series
  - Add a max frequency for spi3
  - Remov unused compatible strings from spi-flash@0
  - Add s and u to isa string
  - Fix mmu-type
  - Remove cache-line size since it is unused (in u-boot) and undocumented
    (upstream)
  - Add timer interrupts to clint0
  - Round up various registers
  - Add riscv,max-priority to plic
  - Add apb* busses, since they have clocks which need to be enabled to access
    their devices
  - Change uart compatible strings to "snps,dw-apb-uart", since that appears to
    match their registers
  - Add compatible string for wdt*
  - Add system reset device under sysctl
  - Add reset device under sysctl
  Changes for v2:
  - Model changed to "Sipeed Maix Bit" to match file name
  - Value of stdout-path fixed
  - SD card slot compatible changed to "mmc-spi-slot"
  - "jedec,spi-nor" added to spi flash compatible list
  - Aliases for spi busses added
  - timebase-frequency divided by 50 to match timer speed
  - cpu-frequency renamed to clock-frequency
  - CPUX_intc restyled to cpuX_intc
  - "kendryte,k210-soc" added to soc compatible list for future-proofing
  - PLIC handle renamed to plic0 from pic0
  - K210_RST_SOC removed from sysrst, due to not being located in the
    reset register
  - K210_RST_* numbers changed to match their bit offset within the reset
    register
  - gpio_controller restyled to gpio-controller
  - Added a second clock to the dma binding to match what the driver expects
  - Changed "snps,designware-spi" compatible string to "snps,dw-apb-ssi" to
    match the correct driver
  - Added a name to the spi clocks
  - Added reg-io-width property to spi bindings
  - Assigned a default parent to K210_CLK_SPI3
  - Removed assigned clocks for ACLK and PLLs
  - Removed u-boot,dm-pre-reloc bindings

 arch/riscv/dts/Makefile                 |   1 +
 arch/riscv/dts/k210-maix-bit.dts        |  42 ++
 arch/riscv/dts/k210.dtsi                | 496 ++++++++++++++++++++++++
 include/dt-bindings/reset/k210-sysctl.h |  38 ++
 4 files changed, 577 insertions(+)
 create mode 100644 arch/riscv/dts/k210-maix-bit.dts
 create mode 100644 arch/riscv/dts/k210.dtsi
 create mode 100644 include/dt-bindings/reset/k210-sysctl.h

Comments

Bin Meng Feb. 4, 2020, 11:32 a.m. UTC | #1
Hi Sean,

On Mon, Feb 3, 2020 at 4:10 AM Sean Anderson <seanga2@gmail.com> wrote:
>
> Where possible, I have tried to find compatible drivers based on the layout of
> registers. However, I have not tested most of this functionality, and most
> devices should be considered descriptive at best. I would appreciate if anyone
> could help identify possibly compatible devices, especially for the timers
> and rtc.
>
> Should the size of a reg be the size of the documented registers, or the size
> of the address space which will be routed to that device?

Perhaps we need use the size of the address space routed to that
device, in case there is some undocumented registers we need handle.

>
> Signed-off-by: Sean Anderson <seanga2@gmail.com>
> ---
>   Changes for v3:
>   - Move this patch to the end of the series
>   - Add a max frequency for spi3
>   - Remov unused compatible strings from spi-flash@0
>   - Add s and u to isa string
>   - Fix mmu-type
>   - Remove cache-line size since it is unused (in u-boot) and undocumented
>     (upstream)
>   - Add timer interrupts to clint0
>   - Round up various registers
>   - Add riscv,max-priority to plic
>   - Add apb* busses, since they have clocks which need to be enabled to access
>     their devices
>   - Change uart compatible strings to "snps,dw-apb-uart", since that appears to
>     match their registers
>   - Add compatible string for wdt*
>   - Add system reset device under sysctl
>   - Add reset device under sysctl
>   Changes for v2:
>   - Model changed to "Sipeed Maix Bit" to match file name
>   - Value of stdout-path fixed
>   - SD card slot compatible changed to "mmc-spi-slot"
>   - "jedec,spi-nor" added to spi flash compatible list
>   - Aliases for spi busses added
>   - timebase-frequency divided by 50 to match timer speed
>   - cpu-frequency renamed to clock-frequency
>   - CPUX_intc restyled to cpuX_intc
>   - "kendryte,k210-soc" added to soc compatible list for future-proofing
>   - PLIC handle renamed to plic0 from pic0
>   - K210_RST_SOC removed from sysrst, due to not being located in the
>     reset register
>   - K210_RST_* numbers changed to match their bit offset within the reset
>     register
>   - gpio_controller restyled to gpio-controller
>   - Added a second clock to the dma binding to match what the driver expects
>   - Changed "snps,designware-spi" compatible string to "snps,dw-apb-ssi" to
>     match the correct driver
>   - Added a name to the spi clocks
>   - Added reg-io-width property to spi bindings
>   - Assigned a default parent to K210_CLK_SPI3
>   - Removed assigned clocks for ACLK and PLLs
>   - Removed u-boot,dm-pre-reloc bindings
>
>  arch/riscv/dts/Makefile                 |   1 +
>  arch/riscv/dts/k210-maix-bit.dts        |  42 ++
>  arch/riscv/dts/k210.dtsi                | 496 ++++++++++++++++++++++++
>  include/dt-bindings/reset/k210-sysctl.h |  38 ++
>  4 files changed, 577 insertions(+)
>  create mode 100644 arch/riscv/dts/k210-maix-bit.dts
>  create mode 100644 arch/riscv/dts/k210.dtsi
>  create mode 100644 include/dt-bindings/reset/k210-sysctl.h
>
> diff --git a/arch/riscv/dts/Makefile b/arch/riscv/dts/Makefile
> index 4f30e6936f..3a6f96c67d 100644
> --- a/arch/riscv/dts/Makefile
> +++ b/arch/riscv/dts/Makefile
> @@ -2,6 +2,7 @@
>
>  dtb-$(CONFIG_TARGET_AX25_AE350) += ae350_32.dtb ae350_64.dtb
>  dtb-$(CONFIG_TARGET_SIFIVE_FU540) += hifive-unleashed-a00.dtb
> +dtb-$(CONFIG_TARGET_SIPEED_MAIX) += k210-maix-bit.dtb
>
>  targets += $(dtb-y)
>
> diff --git a/arch/riscv/dts/k210-maix-bit.dts b/arch/riscv/dts/k210-maix-bit.dts
> new file mode 100644
> index 0000000000..10f36921e0
> --- /dev/null
> +++ b/arch/riscv/dts/k210-maix-bit.dts
> @@ -0,0 +1,42 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
> + */
> +
> +/dts-v1/;
> +
> +#include "k210.dtsi"
> +
> +/ {
> +       model = "Sipeed Maix Bit";
> +       compatible = "sipeed,maix-bit", "kendryte,k210";
> +
> +       chosen {
> +               stdout-path = "serial0:115200";
> +       };
> +};
> +
> +&uarths0 {
> +       status = "okay";
> +};
> +
> +&spi0 {
> +       status = "okay";
> +       slot@0 {
> +               compatible = "mmc-spi-slot";
> +               reg = <0>;
> +               broken-cd;
> +               disable-wp;
> +       };
> +};
> +
> +&spi3 {
> +       status = "okay";
> +       spi-max-frequency = <120000000>;
> +       spi-flash@0 {
> +               compatible = "jedec,spi-nor";
> +               reg = <0>;
> +               spi-max-frequency = <120000000>;
> +               m25p,fast-read;
> +       };
> +};
> diff --git a/arch/riscv/dts/k210.dtsi b/arch/riscv/dts/k210.dtsi
> new file mode 100644
> index 0000000000..cc46b692e6
> --- /dev/null
> +++ b/arch/riscv/dts/k210.dtsi
> @@ -0,0 +1,496 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
> + */
> +
> +#include <dt-bindings/clock/k210-sysctl.h>
> +#include <dt-bindings/mfd/k210-sysctl.h>
> +#include <dt-bindings/reset/k210-sysctl.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;
> +               serial1 = &uart1;
> +               serial2 = &uart2;
> +               serial3 = &uart3;
> +               spi0 = &spi0;
> +               spi1 = &spi1;
> +               spi2 = &spi2;
> +               spi3 = &spi3;
> +       };
> +
> +       clocks {
> +               in0: oscillator {
> +                       compatible = "fixed-clock";
> +                       #clock-cells = <0>;
> +                       clock-frequency = <26000000>;
> +               };
> +       };
> +
> +       cpus {
> +               #address-cells = <1>;
> +               #size-cells = <0>;
> +               timebase-frequency = <7800000>;
> +               cpu0: cpu@0 {
> +                       device_type = "cpu";
> +                       reg = <0>;
> +                       compatible = "riscv";
> +                       riscv,isa = "rv64acdfimsu";
> +                       mmu-type = "sv39";
> +                       i-cache-size = <0x8000>;
> +                       d-cache-size = <0x8000>;
> +                       clocks = <&sysclk K210_CLK_CPU>;
> +                       clock-frequency = <390000000>;

I wonder there is already clocks property, why do we have another
clock-frequency property to provide duplicated information?

> +                       cpu0_intc: interrupt-controller {
> +                               #interrupt-cells = <1>;
> +                               interrupt-controller;
> +                               compatible = "riscv,cpu-intc";
> +                       };
> +               };
> +               cpu1: cpu@1 {
> +                       device_type = "cpu";
> +                       reg = <1>;
> +                       compatible = "riscv";
> +                       riscv,isa = "rv64acdfimsu";
> +                       mmu-type = "sv39";
> +                       i-cache-size = <0x8000>;
> +                       d-cache-size = <0x8000>;
> +                       clocks = <&sysclk K210_CLK_CPU>;
> +                       clock-frequency = <390000000>;
> +                       cpu1_intc: interrupt-controller {
> +                               #interrupt-cells = <1>;
> +                               interrupt-controller;
> +                               compatible = "riscv,cpu-intc";
> +                       };
> +               };
> +       };
> +
> +       sram0: memory@80000000 {
> +               device_type = "memory";
> +               reg = <0x80000000 0x400000>;
> +               clocks = <&sysclk K210_CLK_SRAM0>;
> +       };
> +
> +       sram1: memory@80400000 {
> +               device_type = "memory";
> +               reg = <0x80400000 0x400000>;
> +               clocks = <&sysclk K210_CLK_SRAM1>;
> +       };
> +
> +       reserved-memory {
> +               #address-cells = <1>;
> +               #size-cells = <1>;
> +               ranges;
> +
> +               ai_reserved: ai@80600000 {
> +                       reg = <0x80600000 0x200000>;
> +                       reusable;
> +               };
> +       };
> +
> +       soc {
> +               #address-cells = <1>;
> +               #size-cells = <1>;
> +               compatible = "kendryte,k210-soc", "simple-bus";
> +               ranges;
> +               interrupt-parent = <&plic0>;
> +
> +               clint0: interrupt-controller@2000000 {
> +                       compatible = "riscv,clint0";
> +                       reg = <0x2000000 0x1000>;
> +                       interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
> +                                             <&cpu1_intc 3>, <&cpu1_intc 7>;
> +                       clocks = <&sysclk K210_CLK_CPU>;
> +               };
> +
> +               plic0: interrupt-controller@c000000 {
> +                       #interrupt-cells = <1>;
> +                       interrupt-controller;
> +                       compatible = "kendryte,k210-plic", "riscv,plic1";
> +                       reg = <0xC000000 0x4000000>;
> +                       interrupts-extended = <&cpu0_intc 9>, <&cpu0_intc 11>,
> +                                             <&cpu1_intc 9>, <&cpu1_intc 11>;
> +                       riscv,ndev = <65>;
> +                       riscv,max-priority = <7>;
> +               };
> +

[snip]

Regards,
Bin
Sean Anderson Feb. 4, 2020, 2:23 p.m. UTC | #2
On 2/4/20 6:32 AM, Bin Meng wrote:
> Hi Sean,
> 
> On Mon, Feb 3, 2020 at 4:10 AM Sean Anderson <seanga2@gmail.com> wrote:
>>
>> Where possible, I have tried to find compatible drivers based on the layout of
>> registers. However, I have not tested most of this functionality, and most
>> devices should be considered descriptive at best. I would appreciate if anyone
>> could help identify possibly compatible devices, especially for the timers
>> and rtc.
>>
>> Should the size of a reg be the size of the documented registers, or the size
>> of the address space which will be routed to that device?
> 
> Perhaps we need use the size of the address space routed to that
> device, in case there is some undocumented registers we need handle.

Ok, I'll go with the whole address space then.

>> diff --git a/arch/riscv/dts/k210.dtsi b/arch/riscv/dts/k210.dtsi
>> new file mode 100644
>> index 0000000000..cc46b692e6
>> --- /dev/null
>> +++ b/arch/riscv/dts/k210.dtsi
>> @@ -0,0 +1,496 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
>> + */
>> +
>> +#include <dt-bindings/clock/k210-sysctl.h>
>> +#include <dt-bindings/mfd/k210-sysctl.h>
>> +#include <dt-bindings/reset/k210-sysctl.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;
>> +               serial1 = &uart1;
>> +               serial2 = &uart2;
>> +               serial3 = &uart3;
>> +               spi0 = &spi0;
>> +               spi1 = &spi1;
>> +               spi2 = &spi2;
>> +               spi3 = &spi3;
>> +       };
>> +
>> +       clocks {
>> +               in0: oscillator {
>> +                       compatible = "fixed-clock";
>> +                       #clock-cells = <0>;
>> +                       clock-frequency = <26000000>;
>> +               };
>> +       };
>> +
>> +       cpus {
>> +               #address-cells = <1>;
>> +               #size-cells = <0>;
>> +               timebase-frequency = <7800000>;
>> +               cpu0: cpu@0 {
>> +                       device_type = "cpu";
>> +                       reg = <0>;
>> +                       compatible = "riscv";
>> +                       riscv,isa = "rv64acdfimsu";
>> +                       mmu-type = "sv39";
>> +                       i-cache-size = <0x8000>;
>> +                       d-cache-size = <0x8000>;
>> +                       clocks = <&sysclk K210_CLK_CPU>;
>> +                       clock-frequency = <390000000>;
> 
> I wonder there is already clocks property, why do we have another
> clock-frequency property to provide duplicated information?

This is for compatibility with the existing riscv cpu driver. There is a
patch [1] to move the driver over to using clocks, but I think you
already expressed that it should be merged into this series (not as a
separate series).

[1] https://patchwork.ozlabs.org/project/uboot/list/?series=156381

--Sean
Bin Meng Feb. 4, 2020, 2:40 p.m. UTC | #3
Hi Sean,

On Tue, Feb 4, 2020 at 10:23 PM Sean Anderson <seanga2@gmail.com> wrote:
>
> On 2/4/20 6:32 AM, Bin Meng wrote:
> > Hi Sean,
> >
> > On Mon, Feb 3, 2020 at 4:10 AM Sean Anderson <seanga2@gmail.com> wrote:
> >>
> >> Where possible, I have tried to find compatible drivers based on the layout of
> >> registers. However, I have not tested most of this functionality, and most
> >> devices should be considered descriptive at best. I would appreciate if anyone
> >> could help identify possibly compatible devices, especially for the timers
> >> and rtc.
> >>
> >> Should the size of a reg be the size of the documented registers, or the size
> >> of the address space which will be routed to that device?
> >
> > Perhaps we need use the size of the address space routed to that
> > device, in case there is some undocumented registers we need handle.
>
> Ok, I'll go with the whole address space then.
>
> >> diff --git a/arch/riscv/dts/k210.dtsi b/arch/riscv/dts/k210.dtsi
> >> new file mode 100644
> >> index 0000000000..cc46b692e6
> >> --- /dev/null
> >> +++ b/arch/riscv/dts/k210.dtsi
> >> @@ -0,0 +1,496 @@
> >> +// SPDX-License-Identifier: GPL-2.0+
> >> +/*
> >> + * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
> >> + */
> >> +
> >> +#include <dt-bindings/clock/k210-sysctl.h>
> >> +#include <dt-bindings/mfd/k210-sysctl.h>
> >> +#include <dt-bindings/reset/k210-sysctl.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;
> >> +               serial1 = &uart1;
> >> +               serial2 = &uart2;
> >> +               serial3 = &uart3;
> >> +               spi0 = &spi0;
> >> +               spi1 = &spi1;
> >> +               spi2 = &spi2;
> >> +               spi3 = &spi3;
> >> +       };
> >> +
> >> +       clocks {
> >> +               in0: oscillator {
> >> +                       compatible = "fixed-clock";
> >> +                       #clock-cells = <0>;
> >> +                       clock-frequency = <26000000>;
> >> +               };
> >> +       };
> >> +
> >> +       cpus {
> >> +               #address-cells = <1>;
> >> +               #size-cells = <0>;
> >> +               timebase-frequency = <7800000>;
> >> +               cpu0: cpu@0 {
> >> +                       device_type = "cpu";
> >> +                       reg = <0>;
> >> +                       compatible = "riscv";
> >> +                       riscv,isa = "rv64acdfimsu";
> >> +                       mmu-type = "sv39";
> >> +                       i-cache-size = <0x8000>;
> >> +                       d-cache-size = <0x8000>;
> >> +                       clocks = <&sysclk K210_CLK_CPU>;
> >> +                       clock-frequency = <390000000>;
> >
> > I wonder there is already clocks property, why do we have another
> > clock-frequency property to provide duplicated information?
>
> This is for compatibility with the existing riscv cpu driver. There is a
> patch [1] to move the driver over to using clocks, but I think you
> already expressed that it should be merged into this series (not as a
> separate series).

Yes, so with that 2 patches in this same series, we no longer need
clock-frequency.

>
> [1] https://patchwork.ozlabs.org/project/uboot/list/?series=156381

Regards,
Bin
diff mbox series

Patch

diff --git a/arch/riscv/dts/Makefile b/arch/riscv/dts/Makefile
index 4f30e6936f..3a6f96c67d 100644
--- a/arch/riscv/dts/Makefile
+++ b/arch/riscv/dts/Makefile
@@ -2,6 +2,7 @@ 
 
 dtb-$(CONFIG_TARGET_AX25_AE350) += ae350_32.dtb ae350_64.dtb
 dtb-$(CONFIG_TARGET_SIFIVE_FU540) += hifive-unleashed-a00.dtb
+dtb-$(CONFIG_TARGET_SIPEED_MAIX) += k210-maix-bit.dtb
 
 targets += $(dtb-y)
 
diff --git a/arch/riscv/dts/k210-maix-bit.dts b/arch/riscv/dts/k210-maix-bit.dts
new file mode 100644
index 0000000000..10f36921e0
--- /dev/null
+++ b/arch/riscv/dts/k210-maix-bit.dts
@@ -0,0 +1,42 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
+ */
+
+/dts-v1/;
+
+#include "k210.dtsi"
+
+/ {
+	model = "Sipeed Maix Bit";
+	compatible = "sipeed,maix-bit", "kendryte,k210";
+
+	chosen {
+		stdout-path = "serial0:115200";
+	};
+};
+
+&uarths0 {
+	status = "okay";
+};
+
+&spi0 {
+	status = "okay";
+	slot@0 {
+		compatible = "mmc-spi-slot";
+		reg = <0>;
+		broken-cd;
+		disable-wp;
+	};
+};
+
+&spi3 {
+	status = "okay";
+	spi-max-frequency = <120000000>;
+	spi-flash@0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <120000000>;
+		m25p,fast-read;
+	};
+};
diff --git a/arch/riscv/dts/k210.dtsi b/arch/riscv/dts/k210.dtsi
new file mode 100644
index 0000000000..cc46b692e6
--- /dev/null
+++ b/arch/riscv/dts/k210.dtsi
@@ -0,0 +1,496 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
+ */
+
+#include <dt-bindings/clock/k210-sysctl.h>
+#include <dt-bindings/mfd/k210-sysctl.h>
+#include <dt-bindings/reset/k210-sysctl.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;
+		serial1 = &uart1;
+		serial2 = &uart2;
+		serial3 = &uart3;
+		spi0 = &spi0;
+		spi1 = &spi1;
+		spi2 = &spi2;
+		spi3 = &spi3;
+	};
+
+	clocks {
+		in0: oscillator {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <26000000>;
+		};
+	};
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		timebase-frequency = <7800000>;
+		cpu0: cpu@0 {
+			device_type = "cpu";
+			reg = <0>;
+			compatible = "riscv";
+			riscv,isa = "rv64acdfimsu";
+			mmu-type = "sv39";
+			i-cache-size = <0x8000>;
+			d-cache-size = <0x8000>;
+			clocks = <&sysclk 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 = "riscv";
+			riscv,isa = "rv64acdfimsu";
+			mmu-type = "sv39";
+			i-cache-size = <0x8000>;
+			d-cache-size = <0x8000>;
+			clocks = <&sysclk K210_CLK_CPU>;
+			clock-frequency = <390000000>;
+			cpu1_intc: interrupt-controller {
+				#interrupt-cells = <1>;
+				interrupt-controller;
+				compatible = "riscv,cpu-intc";
+			};
+		};
+	};
+
+	sram0: memory@80000000 {
+		device_type = "memory";
+		reg = <0x80000000 0x400000>;
+		clocks = <&sysclk K210_CLK_SRAM0>;
+	};
+
+	sram1: memory@80400000 {
+		device_type = "memory";
+		reg = <0x80400000 0x400000>;
+		clocks = <&sysclk K210_CLK_SRAM1>;
+	};
+
+	reserved-memory {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges;
+
+		ai_reserved: ai@80600000 {
+			reg = <0x80600000 0x200000>;
+			reusable;
+		};
+	};
+
+	soc {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "kendryte,k210-soc", "simple-bus";
+		ranges;
+		interrupt-parent = <&plic0>;
+
+		clint0: interrupt-controller@2000000 {
+			compatible = "riscv,clint0";
+			reg = <0x2000000 0x1000>;
+			interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
+			                      <&cpu1_intc 3>, <&cpu1_intc 7>;
+			clocks = <&sysclk K210_CLK_CPU>;
+		};
+
+		plic0: interrupt-controller@c000000 {
+			#interrupt-cells = <1>;
+			interrupt-controller;
+			compatible = "kendryte,k210-plic", "riscv,plic1";
+			reg = <0xC000000 0x4000000>;
+			interrupts-extended = <&cpu0_intc 9>, <&cpu0_intc 11>,
+			                      <&cpu1_intc 9>, <&cpu1_intc 11>;
+			riscv,ndev = <65>;
+			riscv,max-priority = <7>;
+		};
+
+		uarths0: serial@38000000 {
+			compatible = "sifive,uart0";
+			reg = <0x38000000 0x20>;
+			interrupts = <33>;
+			clocks = <&sysclk K210_CLK_CPU>;
+			status = "disabled";
+		};
+
+		gpio0: gpio-controller@38001000 {
+			#gpio-cells = <2>;
+			compatible = "none";
+			reg = <0x38001000 0x80>;
+			gpio-controller;
+			interrupts = <34 35 36 37 38 39 40 41
+			              42 43 44 45 46 47 48 49
+			              50 51 52 53 54 55 56 57
+				      58 59 60 61 62 63 64 65>;
+			clocks = <&sysclk K210_CLK_CPU>;
+			status = "disabled";
+		};
+
+		kpu0: kpu@40600000 {
+			compatible = "none";
+			reg = <0x40800000 0x80>;
+			interrupts = <25>;
+			clocks = <&sysclk K210_CLK_AI>;
+			memory-region = <&ai_reserved>;
+			status = "disabled";
+		};
+
+		fft0: fft@42000000 {
+			compatible = "none";
+			reg = <0x42000000 0x400000>;
+			interrupts = <26>;
+			clocks = <&sysclk K210_CLK_FFT>;
+			resets = <&sysrst K210_RST_FFT>;
+			status = "disabled";
+		};
+
+		dmac0: dma-controller@50000000 {
+			compatible = "snps,axi-dma-1.01a";
+			reg = <0x50000000 0x1000>;
+			interrupts = <27 28 29 30 31 32>;
+			clocks = <&sysclk K210_CLK_DMA>, <&sysclk K210_CLK_DMA>;
+			clock-names = "core-clk", "cfgr-clk";
+			resets = <&sysrst K210_RST_DMA>;
+			dma-channels = <6>;
+			snps,dma-masters = <2>;
+			snps,data-width = <5>;
+			snps,block-size = <0x400000 0x400000 0x400000
+			                   0x400000 0x400000 0x400000>;
+			snps,axi-max-burst-len = <256>;
+			status = "disabled";
+		};
+
+		apb0: bus@50200000 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "kendryte,k210-apb", "simple-pm-bus";
+			ranges;
+			clocks = <&sysclk K210_CLK_APB0>;
+
+			gpio1: gpio-controller@50200000 {
+				#gpio-cells = <2>;
+				compatible = "none";
+				reg = <0x50200000 0x80>;
+				gpio-controller;
+				interrupts = <23>;
+				clocks = <&sysclk K210_CLK_GPIO>;
+				resets = <&sysrst K210_RST_GPIO>;
+				status = "disabled";
+			};
+
+			uart1: serial@50210000 {
+				compatible = "snps,dw-apb-uart";
+				reg = <50210000 0x100>;
+				interrupts = <11>;
+				clocks = <&sysclk K210_CLK_UART1>;
+				resets = <&sysrst K210_RST_UART1>;
+				reg-io-width = <4>;
+				dcd-override;
+				dsr-override;
+				cts-override;
+				ri-override;
+				status = "disabled";
+			};
+
+			uart2: serial@50220000 {
+				compatible = "snps,dw-apb-uart";
+				reg = <50220000 0x100>;
+				interrupts = <12>;
+				clocks = <&sysclk K210_CLK_UART2>;
+				resets = <&sysrst K210_RST_UART2>;
+				reg-io-width = <4>;
+				dcd-override;
+				dsr-override;
+				cts-override;
+				ri-override;
+				status = "disabled";
+			};
+
+			uart3: serial@50230000 {
+				compatible = "snps,dw-apb-uart";
+				reg = <50230000 0x100>;
+				interrupts = <13>;
+				clocks = <&sysclk K210_CLK_UART3>;
+				resets = <&sysrst K210_RST_UART3>;
+				reg-io-width = <4>;
+				dcd-override;
+				dsr-override;
+				cts-override;
+				ri-override;
+				status = "disabled";
+			};
+
+			spi2: spi@50240000 {
+				compatible = "snps,dw-apb-ssi";
+				spi-slave;
+				reg = <0x50240000 0x120>;
+				interrupts = <2>;
+				clocks = <&sysclk K210_CLK_SPI2>;
+				resets = <&sysrst K210_RST_SPI2>;
+				status = "disabled";
+			};
+
+			i2s0: i2s@50250000 {
+				compatible = "snps,designware-i2s";
+				reg = <0x50250000 0x200>;
+				interrupts = <5>;
+				clocks = <&sysclk K210_CLK_I2S0>;
+				resets = <&sysrst K210_RST_I2S0>;
+				status = "disabled";
+			};
+
+			apu0: sound@520250200 {
+				compatible = "none";
+				reg = <0x50250200 0x140>;
+				status = "disabled";
+			};
+
+			i2s1: i2s@50260000 {
+				compatible = "snps,designware-i2s";
+				reg = <0x50260000 0x200>;
+				interrupts = <6>;
+				clocks = <&sysclk K210_CLK_I2S1>;
+				resets = <&sysrst K210_RST_I2S1>;
+				status = "disabled";
+			};
+
+			i2s2: i2s@50270000 {
+				compatible = "snps,designware-i2s";
+				reg = <0x50270000 0x200>;
+				interrupts = <7>;
+				clocks = <&sysclk K210_CLK_I2S2>;
+				resets = <&sysrst K210_RST_I2S2>;
+				status = "disabled";
+			};
+
+			i2c0: i2c@50280000 {
+				compatible = "snps,designware-i2c";
+				reg = <0x50280000 0x100>;
+				interrupts = <8>;
+				clocks = <&sysclk K210_CLK_I2C0>;
+				resets = <&sysrst K210_RST_I2C0>;
+				status = "disabled";
+			};
+
+			i2c1: i2c@50290000 {
+				compatible = "snps,designware-i2c";
+				reg = <0x50290000 0x100>;
+				interrupts = <9>;
+				clocks = <&sysclk K210_CLK_I2C1>;
+				resets = <&sysrst K210_RST_I2C1>;
+				status = "disabled";
+			};
+
+
+			i2c2: i2c@502A0000 {
+				compatible = "snps,designware-i2c";
+				reg = <0x502A0000 0x100>;
+				interrupts = <10>;
+				clocks = <&sysclk K210_CLK_I2C2>;
+				resets = <&sysrst K210_RST_I2C2>;
+				status = "disabled";
+			};
+
+			fpioa: pinmux@502B0000 {
+				#pinctrl-cells = <1>;
+				compatible = "none";
+				reg = <0x502B0000 0x100>;
+				clocks = <&sysclk K210_CLK_FPIOA>;
+				resets = <&sysrst K210_RST_FPIOA>;
+				status = "disabled";
+			};
+
+			sha256: sha256@502C0000 {
+				compatible = "none";
+				reg = <0x502C0000 0x40>;
+				clocks = <&sysclk K210_CLK_SHA>;
+				resets = <&sysrst K210_RST_SHA>;
+				status = "disabled";
+			};
+
+			timer0: timer@502D0000 {
+				compatible = "none";
+				reg = <0x502D0000 0x100>;
+				interrupts = <14 15>;
+				clocks = <&sysclk K210_CLK_TIMER0>;
+				resets = <&sysrst K210_RST_TIMER0>;
+				status = "disabled";
+			};
+
+			timer1: timer@502E0000 {
+				compatible = "none";
+				reg = <0x502E0000 0x100>;
+				interrupts = <16 17>;
+				clocks = <&sysclk K210_CLK_TIMER1>;
+				resets = <&sysrst K210_RST_TIMER1>;
+				status = "disabled";
+			};
+
+			timer2: timer@502F0000 {
+				compatible = "none";
+				reg = <0x502F0000 0x100>;
+				interrupts = <18 19>;
+				clocks = <&sysclk K210_CLK_TIMER2>;
+				resets = <&sysrst K210_RST_TIMER2>;
+				status = "disabled";
+			};
+		};
+
+		apb1: bus@50400000 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "kendryte,k210-apb", "simple-pm-bus";
+			ranges;
+			clocks = <&sysclk K210_CLK_APB1>;
+		
+			wdt0: watchdog@50400000 {
+				compatible = "snps,dw-wdt";
+				reg = <0x50400000 0x100>;
+				interrupts = <21>;
+				clocks = <&sysclk K210_CLK_WDT0>;
+				resets = <&sysrst K210_RST_WDT0>;
+				status = "disabled";
+			};
+
+			wdt1: watchdog@50410000 {
+				compatible = "snps,dw-wdt";
+				reg = <0x50410000 0x100>;
+				interrupts = <22>;
+				clocks = <&sysclk K210_CLK_WDT1>;
+				resets = <&sysrst K210_RST_WDT1>;
+				status = "disabled";
+			};
+
+			dvp0: camera@50430000 {
+				compatible = "none";
+				reg = <0x50430000 0x30>;
+				interrupts = <24>;
+				clocks = <&sysclk K210_CLK_DVP>;
+				resets = <&sysrst K210_RST_DVP>;
+				status = "disabled";
+			};
+
+			sysctl: sysctl@50440000 {
+				compatible = "kendryte,k210-sysctl",
+					     "syscon", "simple-mfd";
+				reg = <0x50440000 0x80>;
+				reg-io-width = <4>;
+
+				sysclk: clock-controller {
+					compatible = "kendryte,k210-clk";
+					clocks = <&in0>;
+					#clock-cells = <1>;
+				};
+
+				sysrst: reset-controller {
+					compatible = "kendryte,k210-rst",
+						     "syscon-reset";
+					#reset-cells = <1>;
+					regmap = <&sysctl>;
+					offset = <K210_SYSCTL_PERI_RESET>;
+					mask = <0x27FFFFFF>;
+					assert-high = <1>;
+				};
+
+				reboot {
+					compatible = "syscon-reboot";
+					regmap = <&sysctl>;
+					offset = <K210_SYSCTL_SOFT_RESET>;
+					mask = <1>;
+					value = <1>;
+				};
+			};
+
+			aes0: aes@50450000 {
+				compatible = "none";
+				reg = <0x50450000 0x100>;
+				clocks = <&sysclk K210_CLK_AES>;
+				resets = <&sysrst K210_RST_AES>;
+				status = "disabled";
+			};
+
+			rtc: rts@50460000 {
+				compatible = "none";
+				reg = <0x50460000 0x30>;
+				clocks = <&in0>;
+				resets = <&sysrst K210_RST_RTC>;
+				interrupts = <20>;
+				status = "disabled";
+			};
+		};
+
+		apb2: bus@52000000 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "kendryte,k210-apb", "simple-pm-bus";
+			ranges;
+			clocks = <&sysclk K210_CLK_APB2>;
+
+			spi0: spi@52000000 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				compatible = "snps,dw-apb-ssi";
+				reg = <0x52000000 0x120>;
+				interrupts = <1>;
+				clocks = <&sysclk K210_CLK_SPI0>;
+				clock-names = "ssi_clk";
+				resets = <&sysrst K210_RST_SPI0>;
+				num-cs = <4>;
+				reg-io-width = <4>;
+				status = "disabled";
+			};
+
+			spi1: spi@53000000 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				compatible = "snps,dw-apb-ssi";
+				reg = <0x53000000 0x120>;
+				interrupts = <2>;
+				clocks = <&sysclk K210_CLK_SPI1>;
+				clock-names = "ssi_clk";
+				resets = <&sysrst K210_RST_SPI1>;
+				num-cs = <4>;
+				reg-io-width = <4>;
+				status = "disabled";
+			};
+
+			spi3: spi@54000000 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				compatible = "snps,dw-apb-ssi";
+				reg = <0x54000000 0x120>;
+				interrupts = <4>;
+				clocks = <&sysclk K210_CLK_SPI3>;
+				clock-names = "ssi_clk";
+				resets = <&sysrst K210_RST_SPI3>;
+				num-cs = <4>;
+				reg-io-width = <4>;
+				status = "disabled";
+			};
+		};
+
+		rom0: nvmem@88000000 {
+			reg = <0x88000000 0x4000>;
+			read-only;
+			clocks = <&sysclk K210_CLK_ROM>;
+			resets = <&sysrst K210_RST_ROM>;
+		};
+	};
+};
diff --git a/include/dt-bindings/reset/k210-sysctl.h b/include/dt-bindings/reset/k210-sysctl.h
new file mode 100644
index 0000000000..670e74daaf
--- /dev/null
+++ b/include/dt-bindings/reset/k210-sysctl.h
@@ -0,0 +1,38 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019 Sean Anderson <seanga2@gmail.com>
+ */
+
+#ifndef RESET_K210_SYSCTL_H
+#define RESET_K210_SYSCTL_H
+
+#define K210_RST_ROM 0	
+#define K210_RST_DMA 1	
+#define K210_RST_AI 2	
+#define K210_RST_DVP 3	
+#define K210_RST_FFT 4	
+#define K210_RST_GPIO 5	
+#define K210_RST_SPI0 6	
+#define K210_RST_SPI1 7	
+#define K210_RST_SPI2 8	
+#define K210_RST_SPI3 9	
+#define K210_RST_I2S0 10	
+#define K210_RST_I2S1 11	
+#define K210_RST_I2S2 12	
+#define K210_RST_I2C0 13	
+#define K210_RST_I2C1 14	
+#define K210_RST_I2C2 15	
+#define K210_RST_UART1 16	
+#define K210_RST_UART2 17	
+#define K210_RST_UART3 18	
+#define K210_RST_AES 19	
+#define K210_RST_FPIOA 20	
+#define K210_RST_TIMER0 21	
+#define K210_RST_TIMER1 22	
+#define K210_RST_TIMER2 23	
+#define K210_RST_WDT0 24	
+#define K210_RST_WDT1 25	
+#define K210_RST_SHA 26	
+#define K210_RST_RTC 29	
+
+#endif /* RESET_K210_SYSCTL_H */