k210.dtsi 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2019-20 Sean Anderson <[email protected]>
  4. * Copyright (C) 2020 Western Digital Corporation or its affiliates.
  5. */
  6. #include <dt-bindings/clock/k210-clk.h>
  7. #include <dt-bindings/pinctrl/k210-fpioa.h>
  8. #include <dt-bindings/reset/k210-rst.h>
  9. / {
  10. /*
  11. * Although the K210 is a 64-bit CPU, the address bus is only 32-bits
  12. * wide, and the upper half of all addresses is ignored.
  13. */
  14. #address-cells = <1>;
  15. #size-cells = <1>;
  16. compatible = "canaan,kendryte-k210";
  17. aliases {
  18. serial0 = &uarths0;
  19. serial1 = &uart1;
  20. serial2 = &uart2;
  21. serial3 = &uart3;
  22. };
  23. /*
  24. * The K210 has an sv39 MMU following the privileged specification v1.9.
  25. * Since this is a non-ratified draft specification, the kernel does not
  26. * support it and the K210 support enabled only for the !MMU case.
  27. * Be consistent with this by setting the CPUs MMU type to "none".
  28. */
  29. cpus {
  30. #address-cells = <1>;
  31. #size-cells = <0>;
  32. timebase-frequency = <7800000>;
  33. cpu0: cpu@0 {
  34. device_type = "cpu";
  35. compatible = "canaan,k210", "riscv";
  36. reg = <0>;
  37. riscv,isa = "rv64imafdc";
  38. mmu-type = "riscv,none";
  39. i-cache-block-size = <64>;
  40. i-cache-size = <0x8000>;
  41. d-cache-block-size = <64>;
  42. d-cache-size = <0x8000>;
  43. cpu0_intc: interrupt-controller {
  44. #interrupt-cells = <1>;
  45. interrupt-controller;
  46. compatible = "riscv,cpu-intc";
  47. };
  48. };
  49. cpu1: cpu@1 {
  50. device_type = "cpu";
  51. compatible = "canaan,k210", "riscv";
  52. reg = <1>;
  53. riscv,isa = "rv64imafdc";
  54. mmu-type = "riscv,none";
  55. i-cache-block-size = <64>;
  56. i-cache-size = <0x8000>;
  57. d-cache-block-size = <64>;
  58. d-cache-size = <0x8000>;
  59. cpu1_intc: interrupt-controller {
  60. #interrupt-cells = <1>;
  61. interrupt-controller;
  62. compatible = "riscv,cpu-intc";
  63. };
  64. };
  65. cpu-map {
  66. cluster0 {
  67. core0 {
  68. cpu = <&cpu0>;
  69. };
  70. core1 {
  71. cpu = <&cpu1>;
  72. };
  73. };
  74. };
  75. };
  76. sram: memory@80000000 {
  77. device_type = "memory";
  78. reg = <0x80000000 0x400000>, /* sram0 4 MiB */
  79. <0x80400000 0x200000>, /* sram1 2 MiB */
  80. <0x80600000 0x200000>; /* aisram 2 MiB */
  81. };
  82. sram_controller: memory-controller {
  83. compatible = "canaan,k210-sram";
  84. clocks = <&sysclk K210_CLK_SRAM0>,
  85. <&sysclk K210_CLK_SRAM1>,
  86. <&sysclk K210_CLK_AI>;
  87. clock-names = "sram0", "sram1", "aisram";
  88. };
  89. clocks {
  90. in0: oscillator {
  91. compatible = "fixed-clock";
  92. #clock-cells = <0>;
  93. clock-frequency = <26000000>;
  94. };
  95. };
  96. soc {
  97. #address-cells = <1>;
  98. #size-cells = <1>;
  99. compatible = "simple-bus";
  100. ranges;
  101. interrupt-parent = <&plic0>;
  102. rom0: nvmem@1000 {
  103. reg = <0x1000 0x1000>;
  104. read-only;
  105. };
  106. clint0: timer@2000000 {
  107. compatible = "canaan,k210-clint", "sifive,clint0";
  108. reg = <0x2000000 0xC000>;
  109. interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
  110. <&cpu1_intc 3>, <&cpu1_intc 7>;
  111. };
  112. plic0: interrupt-controller@c000000 {
  113. #interrupt-cells = <1>;
  114. #address-cells = <0>;
  115. compatible = "canaan,k210-plic", "sifive,plic-1.0.0";
  116. reg = <0xC000000 0x4000000>;
  117. interrupt-controller;
  118. interrupts-extended = <&cpu0_intc 11>, <&cpu0_intc 9>,
  119. <&cpu1_intc 11>, <&cpu1_intc 9>;
  120. riscv,ndev = <65>;
  121. };
  122. uarths0: serial@38000000 {
  123. compatible = "canaan,k210-uarths", "sifive,uart0";
  124. reg = <0x38000000 0x1000>;
  125. interrupts = <33>;
  126. clocks = <&sysclk K210_CLK_CPU>;
  127. };
  128. gpio0: gpio-controller@38001000 {
  129. #interrupt-cells = <2>;
  130. #gpio-cells = <2>;
  131. compatible = "canaan,k210-gpiohs", "sifive,gpio0";
  132. reg = <0x38001000 0x1000>;
  133. interrupt-controller;
  134. interrupts = <34>, <35>, <36>, <37>, <38>, <39>, <40>,
  135. <41>, <42>, <43>, <44>, <45>, <46>, <47>,
  136. <48>, <49>, <50>, <51>, <52>, <53>, <54>,
  137. <55>, <56>, <57>, <58>, <59>, <60>, <61>,
  138. <62>, <63>, <64>, <65>;
  139. gpio-controller;
  140. ngpios = <32>;
  141. };
  142. dmac0: dma-controller@50000000 {
  143. compatible = "snps,axi-dma-1.01a";
  144. reg = <0x50000000 0x1000>;
  145. interrupts = <27>, <28>, <29>, <30>, <31>, <32>;
  146. #dma-cells = <1>;
  147. clocks = <&sysclk K210_CLK_DMA>, <&sysclk K210_CLK_DMA>;
  148. clock-names = "core-clk", "cfgr-clk";
  149. resets = <&sysrst K210_RST_DMA>;
  150. dma-channels = <6>;
  151. snps,dma-masters = <2>;
  152. snps,priority = <0 1 2 3 4 5>;
  153. snps,data-width = <5>;
  154. snps,block-size = <0x200000 0x200000 0x200000
  155. 0x200000 0x200000 0x200000>;
  156. snps,axi-max-burst-len = <256>;
  157. };
  158. apb0: bus@50200000 {
  159. #address-cells = <1>;
  160. #size-cells = <1>;
  161. compatible = "simple-pm-bus";
  162. ranges = <0x50200000 0x50200000 0x200000>;
  163. clocks = <&sysclk K210_CLK_APB0>;
  164. gpio1: gpio@50200000 {
  165. #address-cells = <1>;
  166. #size-cells = <0>;
  167. compatible = "snps,dw-apb-gpio";
  168. reg = <0x50200000 0x80>;
  169. clocks = <&sysclk K210_CLK_APB0>,
  170. <&sysclk K210_CLK_GPIO>;
  171. clock-names = "bus", "db";
  172. resets = <&sysrst K210_RST_GPIO>;
  173. gpio1_0: gpio-port@0 {
  174. #gpio-cells = <2>;
  175. #interrupt-cells = <2>;
  176. compatible = "snps,dw-apb-gpio-port";
  177. reg = <0>;
  178. interrupt-controller;
  179. interrupts = <23>;
  180. gpio-controller;
  181. ngpios = <8>;
  182. };
  183. };
  184. uart1: serial@50210000 {
  185. compatible = "snps,dw-apb-uart";
  186. reg = <0x50210000 0x100>;
  187. interrupts = <11>;
  188. clocks = <&sysclk K210_CLK_UART1>,
  189. <&sysclk K210_CLK_APB0>;
  190. clock-names = "baudclk", "apb_pclk";
  191. resets = <&sysrst K210_RST_UART1>;
  192. reg-io-width = <4>;
  193. reg-shift = <2>;
  194. dcd-override;
  195. dsr-override;
  196. cts-override;
  197. ri-override;
  198. };
  199. uart2: serial@50220000 {
  200. compatible = "snps,dw-apb-uart";
  201. reg = <0x50220000 0x100>;
  202. interrupts = <12>;
  203. clocks = <&sysclk K210_CLK_UART2>,
  204. <&sysclk K210_CLK_APB0>;
  205. clock-names = "baudclk", "apb_pclk";
  206. resets = <&sysrst K210_RST_UART2>;
  207. reg-io-width = <4>;
  208. reg-shift = <2>;
  209. dcd-override;
  210. dsr-override;
  211. cts-override;
  212. ri-override;
  213. };
  214. uart3: serial@50230000 {
  215. compatible = "snps,dw-apb-uart";
  216. reg = <0x50230000 0x100>;
  217. interrupts = <13>;
  218. clocks = <&sysclk K210_CLK_UART3>,
  219. <&sysclk K210_CLK_APB0>;
  220. clock-names = "baudclk", "apb_pclk";
  221. resets = <&sysrst K210_RST_UART3>;
  222. reg-io-width = <4>;
  223. reg-shift = <2>;
  224. dcd-override;
  225. dsr-override;
  226. cts-override;
  227. ri-override;
  228. };
  229. spi2: spi@50240000 {
  230. compatible = "canaan,k210-spi";
  231. spi-slave;
  232. reg = <0x50240000 0x100>;
  233. #address-cells = <0>;
  234. #size-cells = <0>;
  235. interrupts = <3>;
  236. clocks = <&sysclk K210_CLK_SPI2>,
  237. <&sysclk K210_CLK_APB0>;
  238. clock-names = "ssi_clk", "pclk";
  239. resets = <&sysrst K210_RST_SPI2>;
  240. spi-max-frequency = <25000000>;
  241. };
  242. i2s0: i2s@50250000 {
  243. compatible = "canaan,k210-i2s", "snps,designware-i2s";
  244. reg = <0x50250000 0x200>;
  245. interrupts = <5>;
  246. clocks = <&sysclk K210_CLK_I2S0>;
  247. clock-names = "i2sclk";
  248. resets = <&sysrst K210_RST_I2S0>;
  249. };
  250. i2s1: i2s@50260000 {
  251. compatible = "canaan,k210-i2s", "snps,designware-i2s";
  252. reg = <0x50260000 0x200>;
  253. interrupts = <6>;
  254. clocks = <&sysclk K210_CLK_I2S1>;
  255. clock-names = "i2sclk";
  256. resets = <&sysrst K210_RST_I2S1>;
  257. };
  258. i2s2: i2s@50270000 {
  259. compatible = "canaan,k210-i2s", "snps,designware-i2s";
  260. reg = <0x50270000 0x200>;
  261. interrupts = <7>;
  262. clocks = <&sysclk K210_CLK_I2S2>;
  263. clock-names = "i2sclk";
  264. resets = <&sysrst K210_RST_I2S2>;
  265. };
  266. i2c0: i2c@50280000 {
  267. compatible = "snps,designware-i2c";
  268. reg = <0x50280000 0x100>;
  269. interrupts = <8>;
  270. clocks = <&sysclk K210_CLK_I2C0>,
  271. <&sysclk K210_CLK_APB0>;
  272. clock-names = "ref", "pclk";
  273. resets = <&sysrst K210_RST_I2C0>;
  274. };
  275. i2c1: i2c@50290000 {
  276. compatible = "snps,designware-i2c";
  277. reg = <0x50290000 0x100>;
  278. interrupts = <9>;
  279. clocks = <&sysclk K210_CLK_I2C1>,
  280. <&sysclk K210_CLK_APB0>;
  281. clock-names = "ref", "pclk";
  282. resets = <&sysrst K210_RST_I2C1>;
  283. };
  284. i2c2: i2c@502a0000 {
  285. compatible = "snps,designware-i2c";
  286. reg = <0x502A0000 0x100>;
  287. interrupts = <10>;
  288. clocks = <&sysclk K210_CLK_I2C2>,
  289. <&sysclk K210_CLK_APB0>;
  290. clock-names = "ref", "pclk";
  291. resets = <&sysrst K210_RST_I2C2>;
  292. };
  293. fpioa: pinmux@502b0000 {
  294. compatible = "canaan,k210-fpioa";
  295. reg = <0x502B0000 0x100>;
  296. clocks = <&sysclk K210_CLK_FPIOA>,
  297. <&sysclk K210_CLK_APB0>;
  298. clock-names = "ref", "pclk";
  299. resets = <&sysrst K210_RST_FPIOA>;
  300. canaan,k210-sysctl-power = <&sysctl 108>;
  301. };
  302. timer0: timer@502d0000 {
  303. compatible = "snps,dw-apb-timer";
  304. reg = <0x502D0000 0x14>;
  305. interrupts = <14>;
  306. clocks = <&sysclk K210_CLK_TIMER0>,
  307. <&sysclk K210_CLK_APB0>;
  308. clock-names = "timer", "pclk";
  309. resets = <&sysrst K210_RST_TIMER0>;
  310. };
  311. timer1: timer@502d0014 {
  312. compatible = "snps,dw-apb-timer";
  313. reg = <0x502D0014 0x14>;
  314. interrupts = <15>;
  315. clocks = <&sysclk K210_CLK_TIMER0>,
  316. <&sysclk K210_CLK_APB0>;
  317. clock-names = "timer", "pclk";
  318. resets = <&sysrst K210_RST_TIMER0>;
  319. };
  320. timer2: timer@502e0000 {
  321. compatible = "snps,dw-apb-timer";
  322. reg = <0x502E0000 0x14>;
  323. interrupts = <16>;
  324. clocks = <&sysclk K210_CLK_TIMER1>,
  325. <&sysclk K210_CLK_APB0>;
  326. clock-names = "timer", "pclk";
  327. resets = <&sysrst K210_RST_TIMER1>;
  328. };
  329. timer3: timer@502e0014 {
  330. compatible = "snps,dw-apb-timer";
  331. reg = <0x502E0014 0x114>;
  332. interrupts = <17>;
  333. clocks = <&sysclk K210_CLK_TIMER1>,
  334. <&sysclk K210_CLK_APB0>;
  335. clock-names = "timer", "pclk";
  336. resets = <&sysrst K210_RST_TIMER1>;
  337. };
  338. timer4: timer@502f0000 {
  339. compatible = "snps,dw-apb-timer";
  340. reg = <0x502F0000 0x14>;
  341. interrupts = <18>;
  342. clocks = <&sysclk K210_CLK_TIMER2>,
  343. <&sysclk K210_CLK_APB0>;
  344. clock-names = "timer", "pclk";
  345. resets = <&sysrst K210_RST_TIMER2>;
  346. };
  347. timer5: timer@502f0014 {
  348. compatible = "snps,dw-apb-timer";
  349. reg = <0x502F0014 0x14>;
  350. interrupts = <19>;
  351. clocks = <&sysclk K210_CLK_TIMER2>,
  352. <&sysclk K210_CLK_APB0>;
  353. clock-names = "timer", "pclk";
  354. resets = <&sysrst K210_RST_TIMER2>;
  355. };
  356. };
  357. apb1: bus@50400000 {
  358. #address-cells = <1>;
  359. #size-cells = <1>;
  360. compatible = "simple-pm-bus";
  361. ranges = <0x50400000 0x50400000 0x40100>;
  362. clocks = <&sysclk K210_CLK_APB1>;
  363. wdt0: watchdog@50400000 {
  364. compatible = "snps,dw-wdt";
  365. reg = <0x50400000 0x100>;
  366. interrupts = <21>;
  367. clocks = <&sysclk K210_CLK_WDT0>,
  368. <&sysclk K210_CLK_APB1>;
  369. clock-names = "tclk", "pclk";
  370. resets = <&sysrst K210_RST_WDT0>;
  371. };
  372. wdt1: watchdog@50410000 {
  373. compatible = "snps,dw-wdt";
  374. reg = <0x50410000 0x100>;
  375. interrupts = <22>;
  376. clocks = <&sysclk K210_CLK_WDT1>,
  377. <&sysclk K210_CLK_APB1>;
  378. clock-names = "tclk", "pclk";
  379. resets = <&sysrst K210_RST_WDT1>;
  380. };
  381. sysctl: syscon@50440000 {
  382. compatible = "canaan,k210-sysctl",
  383. "syscon", "simple-mfd";
  384. reg = <0x50440000 0x100>;
  385. clocks = <&sysclk K210_CLK_APB1>;
  386. clock-names = "pclk";
  387. sysclk: clock-controller {
  388. #clock-cells = <1>;
  389. compatible = "canaan,k210-clk";
  390. clocks = <&in0>;
  391. };
  392. sysrst: reset-controller {
  393. compatible = "canaan,k210-rst";
  394. #reset-cells = <1>;
  395. };
  396. reboot: syscon-reboot {
  397. compatible = "syscon-reboot";
  398. regmap = <&sysctl>;
  399. offset = <48>;
  400. mask = <1>;
  401. value = <1>;
  402. };
  403. };
  404. };
  405. apb2: bus@52000000 {
  406. #address-cells = <1>;
  407. #size-cells = <1>;
  408. compatible = "simple-pm-bus";
  409. ranges = <0x52000000 0x52000000 0x2000200>;
  410. clocks = <&sysclk K210_CLK_APB2>;
  411. spi0: spi@52000000 {
  412. #address-cells = <1>;
  413. #size-cells = <0>;
  414. compatible = "canaan,k210-spi";
  415. reg = <0x52000000 0x100>;
  416. interrupts = <1>;
  417. clocks = <&sysclk K210_CLK_SPI0>,
  418. <&sysclk K210_CLK_APB2>;
  419. clock-names = "ssi_clk", "pclk";
  420. resets = <&sysrst K210_RST_SPI0>;
  421. reset-names = "spi";
  422. num-cs = <4>;
  423. reg-io-width = <4>;
  424. };
  425. spi1: spi@53000000 {
  426. #address-cells = <1>;
  427. #size-cells = <0>;
  428. compatible = "canaan,k210-spi";
  429. reg = <0x53000000 0x100>;
  430. interrupts = <2>;
  431. clocks = <&sysclk K210_CLK_SPI1>,
  432. <&sysclk K210_CLK_APB2>;
  433. clock-names = "ssi_clk", "pclk";
  434. resets = <&sysrst K210_RST_SPI1>;
  435. reset-names = "spi";
  436. num-cs = <4>;
  437. reg-io-width = <4>;
  438. };
  439. spi3: spi@54000000 {
  440. #address-cells = <1>;
  441. #size-cells = <0>;
  442. compatible = "snps,dwc-ssi-1.01a";
  443. reg = <0x54000000 0x200>;
  444. interrupts = <4>;
  445. clocks = <&sysclk K210_CLK_SPI3>,
  446. <&sysclk K210_CLK_APB2>;
  447. clock-names = "ssi_clk", "pclk";
  448. resets = <&sysrst K210_RST_SPI3>;
  449. reset-names = "spi";
  450. num-cs = <4>;
  451. reg-io-width = <4>;
  452. };
  453. };
  454. };
  455. };