Message ID | 8c29e4d8-430b-e232-9a0e-27642bfea219@gmail.com |
---|---|
State | New |
Headers | show |
Series | riscv: Add Sipeed Maix support | expand |
Hi Sean, On Mon, Feb 3, 2020 at 4:10 AM Sean Anderson <seanga2 at 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 at 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 at 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 at 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 at 0 { > + compatible = "mmc-spi-slot"; > + reg = <0>; > + broken-cd; > + disable-wp; > + }; > +}; > + > +&spi3 { > + status = "okay"; > + spi-max-frequency = <120000000>; > + spi-flash at 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 at 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 at 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 at 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 at 80000000 { > + device_type = "memory"; > + reg = <0x80000000 0x400000>; > + clocks = <&sysclk K210_CLK_SRAM0>; > + }; > + > + sram1: memory at 80400000 { > + device_type = "memory"; > + reg = <0x80400000 0x400000>; > + clocks = <&sysclk K210_CLK_SRAM1>; > + }; > + > + reserved-memory { > + #address-cells = <1>; > + #size-cells = <1>; > + ranges; > + > + ai_reserved: ai at 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 at 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 at 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
On 2/4/20 6:32 AM, Bin Meng wrote: > Hi Sean, > > On Mon, Feb 3, 2020 at 4:10 AM Sean Anderson <seanga2 at 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 at 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 at 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
Hi Sean, On Tue, Feb 4, 2020 at 10:23 PM Sean Anderson <seanga2 at 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 at 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 at 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 at 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 --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 at 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 at 0 { + compatible = "mmc-spi-slot"; + reg = <0>; + broken-cd; + disable-wp; + }; +}; + +&spi3 { + status = "okay"; + spi-max-frequency = <120000000>; + spi-flash at 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 at 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 at 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 at 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 at 80000000 { + device_type = "memory"; + reg = <0x80000000 0x400000>; + clocks = <&sysclk K210_CLK_SRAM0>; + }; + + sram1: memory at 80400000 { + device_type = "memory"; + reg = <0x80400000 0x400000>; + clocks = <&sysclk K210_CLK_SRAM1>; + }; + + reserved-memory { + #address-cells = <1>; + #size-cells = <1>; + ranges; + + ai_reserved: ai at 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 at 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 at 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 at 38000000 { + compatible = "sifive,uart0"; + reg = <0x38000000 0x20>; + interrupts = <33>; + clocks = <&sysclk K210_CLK_CPU>; + status = "disabled"; + }; + + gpio0: gpio-controller at 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 at 40600000 { + compatible = "none"; + reg = <0x40800000 0x80>; + interrupts = <25>; + clocks = <&sysclk K210_CLK_AI>; + memory-region = <&ai_reserved>; + status = "disabled"; + }; + + fft0: fft at 42000000 { + compatible = "none"; + reg = <0x42000000 0x400000>; + interrupts = <26>; + clocks = <&sysclk K210_CLK_FFT>; + resets = <&sysrst K210_RST_FFT>; + status = "disabled"; + }; + + dmac0: dma-controller at 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 at 50200000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "kendryte,k210-apb", "simple-pm-bus"; + ranges; + clocks = <&sysclk K210_CLK_APB0>; + + gpio1: gpio-controller at 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 at 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 at 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 at 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 at 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 at 50250000 { + compatible = "snps,designware-i2s"; + reg = <0x50250000 0x200>; + interrupts = <5>; + clocks = <&sysclk K210_CLK_I2S0>; + resets = <&sysrst K210_RST_I2S0>; + status = "disabled"; + }; + + apu0: sound at 520250200 { + compatible = "none"; + reg = <0x50250200 0x140>; + status = "disabled"; + }; + + i2s1: i2s at 50260000 { + compatible = "snps,designware-i2s"; + reg = <0x50260000 0x200>; + interrupts = <6>; + clocks = <&sysclk K210_CLK_I2S1>; + resets = <&sysrst K210_RST_I2S1>; + status = "disabled"; + }; + + i2s2: i2s at 50270000 { + compatible = "snps,designware-i2s"; + reg = <0x50270000 0x200>; + interrupts = <7>; + clocks = <&sysclk K210_CLK_I2S2>; + resets = <&sysrst K210_RST_I2S2>; + status = "disabled"; + }; + + i2c0: i2c at 50280000 { + compatible = "snps,designware-i2c"; + reg = <0x50280000 0x100>; + interrupts = <8>; + clocks = <&sysclk K210_CLK_I2C0>; + resets = <&sysrst K210_RST_I2C0>; + status = "disabled"; + }; + + i2c1: i2c at 50290000 { + compatible = "snps,designware-i2c"; + reg = <0x50290000 0x100>; + interrupts = <9>; + clocks = <&sysclk K210_CLK_I2C1>; + resets = <&sysrst K210_RST_I2C1>; + status = "disabled"; + }; + + + i2c2: i2c at 502A0000 { + compatible = "snps,designware-i2c"; + reg = <0x502A0000 0x100>; + interrupts = <10>; + clocks = <&sysclk K210_CLK_I2C2>; + resets = <&sysrst K210_RST_I2C2>; + status = "disabled"; + }; + + fpioa: pinmux at 502B0000 { + #pinctrl-cells = <1>; + compatible = "none"; + reg = <0x502B0000 0x100>; + clocks = <&sysclk K210_CLK_FPIOA>; + resets = <&sysrst K210_RST_FPIOA>; + status = "disabled"; + }; + + sha256: sha256 at 502C0000 { + compatible = "none"; + reg = <0x502C0000 0x40>; + clocks = <&sysclk K210_CLK_SHA>; + resets = <&sysrst K210_RST_SHA>; + status = "disabled"; + }; + + timer0: timer at 502D0000 { + compatible = "none"; + reg = <0x502D0000 0x100>; + interrupts = <14 15>; + clocks = <&sysclk K210_CLK_TIMER0>; + resets = <&sysrst K210_RST_TIMER0>; + status = "disabled"; + }; + + timer1: timer at 502E0000 { + compatible = "none"; + reg = <0x502E0000 0x100>; + interrupts = <16 17>; + clocks = <&sysclk K210_CLK_TIMER1>; + resets = <&sysrst K210_RST_TIMER1>; + status = "disabled"; + }; + + timer2: timer at 502F0000 { + compatible = "none"; + reg = <0x502F0000 0x100>; + interrupts = <18 19>; + clocks = <&sysclk K210_CLK_TIMER2>; + resets = <&sysrst K210_RST_TIMER2>; + status = "disabled"; + }; + }; + + apb1: bus at 50400000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "kendryte,k210-apb", "simple-pm-bus"; + ranges; + clocks = <&sysclk K210_CLK_APB1>; + + wdt0: watchdog at 50400000 { + compatible = "snps,dw-wdt"; + reg = <0x50400000 0x100>; + interrupts = <21>; + clocks = <&sysclk K210_CLK_WDT0>; + resets = <&sysrst K210_RST_WDT0>; + status = "disabled"; + }; + + wdt1: watchdog at 50410000 { + compatible = "snps,dw-wdt"; + reg = <0x50410000 0x100>; + interrupts = <22>; + clocks = <&sysclk K210_CLK_WDT1>; + resets = <&sysrst K210_RST_WDT1>; + status = "disabled"; + }; + + dvp0: camera at 50430000 { + compatible = "none"; + reg = <0x50430000 0x30>; + interrupts = <24>; + clocks = <&sysclk K210_CLK_DVP>; + resets = <&sysrst K210_RST_DVP>; + status = "disabled"; + }; + + sysctl: sysctl at 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 at 50450000 { + compatible = "none"; + reg = <0x50450000 0x100>; + clocks = <&sysclk K210_CLK_AES>; + resets = <&sysrst K210_RST_AES>; + status = "disabled"; + }; + + rtc: rts at 50460000 { + compatible = "none"; + reg = <0x50460000 0x30>; + clocks = <&in0>; + resets = <&sysrst K210_RST_RTC>; + interrupts = <20>; + status = "disabled"; + }; + }; + + apb2: bus at 52000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "kendryte,k210-apb", "simple-pm-bus"; + ranges; + clocks = <&sysclk K210_CLK_APB2>; + + spi0: spi at 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 at 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 at 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 at 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 at 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 */
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 at 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 at 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