1/*
2 * Copyright (c) 2024 Andrew Featherstone
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#include <zephyr/dt-bindings/adc/adc.h>
8#include <zephyr/dt-bindings/gpio/gpio.h>
9#include <zephyr/dt-bindings/clock/rpi_pico_rp2350_clock.h>
10#include <zephyr/dt-bindings/i2c/i2c.h>
11#include <zephyr/dt-bindings/regulator/rpi_pico.h>
12#include <zephyr/dt-bindings/reset/rp2350_reset.h>
13#include <mem.h>
14
15#ifndef RPI_PICO_DEFAULT_IRQ_PRIORITY
16#define RPI_PICO_DEFAULT_IRQ_PRIORITY 7
17#endif
18
19/ {
20	aliases {
21		die-temp0 = &die_temp;
22	};
23
24	cpus {
25		#address-cells = <1>;
26		#size-cells = <0>;
27
28		/* There are two CPU sockets in the RP2350-series SoCs.
29		 * Represent the sockets in the device tree as these two
30		 * partially-defined CPU instances. Use a separate DTSI file to
31		 * define what kind of CPU cores they are.
32		 */
33		cpu0: cpu@0 {
34			reg = <0>;
35		};
36
37		cpu1: cpu@1 {
38			reg = <1>;
39		};
40	};
41
42	clocks {
43		clk_gpout0: clk-gpout0 {
44			compatible = "raspberrypi,pico-clock";
45			clocks = <&pll_sys>;
46			clock-names = "pll_sys";
47			clock-frequency = <150000000>;
48			#clock-cells = <0>;
49			#address-cells = <0>;
50		};
51
52		clk_gpout1: clk-gpout1 {
53			compatible = "raspberrypi,pico-clock";
54			clocks = <&pll_sys>;
55			clock-names = "pll_sys";
56			clock-frequency = <150000000>;
57			#clock-cells = <0>;
58		};
59
60		clk_gpout2: clk-gpout2 {
61			compatible = "raspberrypi,pico-clock";
62			clocks = <&pll_sys>;
63			clock-names = "pll_sys";
64			clock-frequency = <150000000>;
65			#clock-cells = <0>;
66		};
67
68		clk_gpout3: clk-gpout3 {
69			compatible = "raspberrypi,pico-clock";
70			clocks = <&pll_sys>;
71			clock-names = "pll_sys";
72			clock-frequency = <150000000>;
73			#clock-cells = <0>;
74		};
75
76		clk_hstx: clk-hstx {
77			compatible = "raspberrypi,pico-clock";
78			clocks = <&pll_sys>;
79			clock-names = "pll_sys";
80			clock-frequency = <150000000>;
81			#clock-cells = <0>;
82		};
83
84		clk_ref: clk-ref {
85			compatible = "raspberrypi,pico-clock";
86			clocks = <&xosc>;
87			clock-names = "xosc";
88			clock-frequency = <12000000>;
89			#clock-cells = <0>;
90		};
91
92		clk_sys: clk-sys {
93			compatible = "raspberrypi,pico-clock";
94			clocks = <&pll_sys>;
95			clock-names = "pll_sys";
96			clock-frequency = <150000000>;
97			#clock-cells = <0>;
98		};
99
100		clk_usb: clk-usb {
101			compatible = "raspberrypi,pico-clock";
102			clocks = <&pll_usb>;
103			clock-names = "pll_usb";
104			clock-frequency = <48000000>;
105			#clock-cells = <0>;
106		};
107
108		clk_adc: clk-adc {
109			compatible = "raspberrypi,pico-clock";
110			clocks = <&pll_usb>;
111			clock-names = "pll_usb";
112			clock-frequency = <48000000>;
113			#clock-cells = <0>;
114		};
115
116		clk_peri: clk-peri {
117			compatible = "raspberrypi,pico-clock";
118			clocks = <&clk_sys>;
119			clock-names = "clk_sys";
120			clock-frequency = <150000000>;
121			#clock-cells = <0>;
122		};
123
124		pll_sys: pll-sys {
125			compatible = "raspberrypi,pico-pll";
126			clocks = <&xosc>;
127			clock-names = "xosc";
128			clock-div= <1>;
129			fb-div= <125>;
130			post-div1 = <5>;
131			post-div2 = <2>;
132			#clock-cells = <0>;
133		};
134
135		pll_usb: pll-usb {
136			compatible = "raspberrypi,pico-pll";
137			clocks = <&xosc>;
138			clock-names = "xosc";
139			clock-div= <1>;
140			fb-div = <100>;
141			post-div1 = <5>;
142			post-div2 = <5>;
143			#clock-cells = <0>;
144		};
145
146		rosc: rosc {
147			compatible = "raspberrypi,pico-rosc";
148			clock-frequency = <6500000>;
149			range = <RPI_PICO_ROSC_RANGE_RESET>;
150			stage-drive-strength = <0>, <0>, <0>, <0>, <0>, <0>, <0>, <0>;
151			clock-div = <16>;
152			phase = <0>;
153			#clock-cells = <0>;
154		};
155
156		rosc_ph: rosc-ph {
157			compatible = "raspberrypi,pico-clock";
158			clock-frequency = <6500000>;
159			clocks = <&rosc>;
160			clock-names = "rosc";
161			#clock-cells = <0>;
162		};
163
164		xosc: xosc {
165			compatible = "raspberrypi,pico-xosc";
166			clock-frequency = <12000000>;
167			#clock-cells = <0>;
168		};
169
170		gpin0: gpin0 {
171			compatible = "raspberrypi,pico-clock";
172			status = "disabled";
173			clock-frequency = <0>;
174			#clock-cells = <0>;
175		};
176
177		gpin1: gpin1 {
178			compatible = "raspberrypi,pico-clock";
179			status = "disabled";
180			clock-frequency = <0>;
181			#clock-cells = <0>;
182		};
183	};
184
185	soc {
186		compatible = "raspberrypi,rp2350", "simple-bus";
187
188		sram0: memory@20000000 {
189			compatible = "mmio-sram";
190			reg = <0x20000000 DT_SIZE_K(520)>;
191		};
192
193		qmi: flash-controller@400d0000 {
194			compatible = "raspberrypi,pico-flash-controller";
195			reg = <0x400d0000 0xfc>;
196
197			#address-cells = <1>;
198			#size-cells = <1>;
199
200			flash0: flash@10000000 {
201				compatible = "soc-nv-flash";
202				write-block-size = <1>;
203				erase-block-size = <DT_SIZE_K(4)>;
204			};
205			status = "disabled";
206		};
207
208		reset: reset-controller@40020000 {
209			compatible = "raspberrypi,pico-reset";
210			reg = <0x40020000 DT_SIZE_K(4)>;
211			reg-width = <4>;
212			active-low = <0>;
213			#reset-cells = <1>;
214		};
215
216		clocks: clock-controller@40010000 {
217			compatible = "raspberrypi,pico-clock-controller";
218			reg = <0x40010000 DT_SIZE_K(4)
219			       0x40048000 DT_SIZE_K(4)
220			       0x40050000 DT_SIZE_K(4)
221			       0x40058000 DT_SIZE_K(4)
222			       0x400e8000 DT_SIZE_K(4)>;
223			reg-names = "clocks", "xosc", "pll_sys", "pll_usb", "rosc";
224			#clock-cells = <1>;
225			status = "okay";
226			clocks = <&clk_gpout0>, <&clk_gpout1>, <&clk_gpout2>, <&clk_gpout3>,
227				 <&clk_hstx>, <&clk_ref>, <&clk_sys>, <&clk_peri>,
228				 <&clk_usb>, <&clk_adc>,
229				 <&pll_sys>, <&pll_usb>, <&xosc>, <&rosc>, <&rosc_ph>,
230				 <&gpin0>, <&gpin1>;
231			clock-names = "clk_gpout0", "clk_gpout1", "clk_gpout2", "clk_gpout3",
232				 "clk_hstx", "clk_ref", "clk_sys", "clk_peri",
233				 "clk_usb", "clk_adc",
234				 "pll_sys", "pll_usb", "xosc", "rosc", "rosc_ph",
235				 "gpin0", "gpin1";
236		};
237
238		gpio0_map: gpio@40028000 {
239			compatible = "raspberrypi,pico-gpio";
240			reg = <0x40028000 DT_SIZE_K(4)>;
241			interrupts = <21 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
242
243			gpio-map-mask = <0xffffffe0 0xffffffc0>;
244			gpio-map-pass-thru = <0x1f 0x3f>;
245			gpio-map = <0x00 0x0 &gpio0 0x0 0x0
246				    0x20 0x0 &gpio0_hi 0x0 0x0>;
247			#gpio-cells = <2>;
248			#address-cells = <1>;
249			#size-cells = <0>;
250
251			gpio0: gpio-port@0 {
252				compatible = "raspberrypi,pico-gpio-port";
253				reg = <0x0>;
254				status = "disabled";
255				gpio-controller;
256				#gpio-cells = <2>;
257				ngpios = <32>;
258			};
259
260			gpio0_hi: gpio-port@1 {
261				compatible = "raspberrypi,pico-gpio-port";
262				reg = <0x1>;
263				status = "disabled";
264				gpio-controller;
265				#gpio-cells = <2>;
266				ngpios = <32>;
267			};
268		};
269
270		uart0: uart@40070000 {
271			compatible = "raspberrypi,pico-uart", "arm,pl011";
272			reg = <0x40070000 DT_SIZE_K(4)>;
273			clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>;
274			resets = <&reset RPI_PICO_RESETS_RESET_UART0>;
275			interrupts = <33 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
276			interrupt-names = "uart0";
277			status = "disabled";
278		};
279
280		uart1: uart@40078000 {
281			compatible = "raspberrypi,pico-uart", "arm,pl011";
282			reg = <0x40078000 DT_SIZE_K(4)>;
283			clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>;
284			resets = <&reset RPI_PICO_RESETS_RESET_UART1>;
285			interrupts = <34 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
286			interrupt-names = "uart1";
287			status = "disabled";
288		};
289
290		spi0: spi@40080000 {
291			compatible = "raspberrypi,pico-spi", "arm,pl022";
292			#address-cells = <1>;
293			#size-cells = <0>;
294			reg = <0x40080000 DT_SIZE_K(4)>;
295			clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>;
296			resets = <&reset RPI_PICO_RESETS_RESET_SPI0>;
297			interrupts = <31 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
298			interrupt-names = "spi0";
299			status = "disabled";
300		};
301
302		spi1: spi@40088000 {
303			compatible = "raspberrypi,pico-spi", "arm,pl022";
304			#address-cells = <1>;
305			#size-cells = <0>;
306			reg = <0x40088000 DT_SIZE_K(4)>;
307			resets = <&reset RPI_PICO_RESETS_RESET_SPI1>;
308			clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>;
309			interrupts = <32 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
310			interrupt-names = "spi1";
311			status = "disabled";
312		};
313
314		i2c0: i2c@40090000 {
315			compatible = "raspberrypi,pico-i2c", "snps,designware-i2c";
316			#address-cells = <1>;
317			#size-cells = <0>;
318			reg = <0x40090000 DT_SIZE_K(4)>;
319			resets = <&reset RPI_PICO_RESETS_RESET_I2C0>;
320			clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>;
321			interrupts = <36 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
322			interrupt-names = "i2c0";
323			status = "disabled";
324		};
325
326		i2c1: i2c@40098000 {
327			compatible = "raspberrypi,pico-i2c", "snps,designware-i2c";
328			#address-cells = <1>;
329			#size-cells = <0>;
330			reg = <0x40098000 DT_SIZE_K(4)>;
331			resets = <&reset RPI_PICO_RESETS_RESET_I2C1>;
332			clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>;
333			interrupts = <37 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
334			interrupt-names = "i2c1";
335			status = "disabled";
336		};
337
338		adc: adc@400a0000 {
339			compatible = "raspberrypi,pico-adc";
340			reg = <0x400a0000 DT_SIZE_K(4)>;
341			resets = <&reset RPI_PICO_RESETS_RESET_ADC>;
342			clocks = <&clocks RPI_PICO_CLKID_CLK_ADC>;
343			interrupts = <35 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
344			interrupt-names = "adc0";
345			status = "disabled";
346			#io-channel-cells = <1>;
347		};
348
349		pwm: pwm@400a8000 {
350			compatible = "raspberrypi,pico-pwm";
351			reg = <0x400a8000 DT_SIZE_K(4)>;
352			resets = <&reset RPI_PICO_RESETS_RESET_PWM>;
353			clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>;
354			interrupts = <8 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
355					<9 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
356			interrupt-names = "PWM_IRQ_WRAP_0",
357						"PWM_IRQ_WRAP_1";
358			status = "disabled";
359			#pwm-cells = <3>;
360		};
361
362		timer0: timer@400b0000 {
363			compatible = "raspberrypi,pico-timer";
364			reg = <0x400b0000 DT_SIZE_K(4)>;
365			resets = <&reset RPI_PICO_RESETS_RESET_TIMER0>;
366			clocks = <&clocks RPI_PICO_CLKID_CLK_REF>;
367			interrupts = <0 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
368				     <1 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
369				     <2 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
370				     <3 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
371			interrupt-names = "TIMER0_IRQ_0",
372					  "TIMER0_IRQ_1",
373					  "TIMER0_IRQ_2",
374					  "TIMER0_IRQ_3";
375			status = "disabled";
376		};
377
378		timer1: timer@400b8000 {
379			compatible = "raspberrypi,pico-timer";
380			reg = <0x400b8000 DT_SIZE_K(4)>;
381			resets = <&reset RPI_PICO_RESETS_RESET_TIMER1>;
382			clocks = <&clocks RPI_PICO_CLKID_CLK_REF>;
383			interrupts = <4 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
384				     <5 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
385				     <6 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
386				     <7 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
387			interrupt-names = "TIMER1_IRQ_0",
388					  "TIMER1_IRQ_1",
389					  "TIMER1_IRQ_2",
390					  "TIMER1_IRQ_3";
391			status = "disabled";
392		};
393
394		wdt0: watchdog@400d8000 {
395			compatible = "raspberrypi,pico-watchdog";
396			reg = <0x400d8000 DT_SIZE_K(4)>;
397			clocks = <&clocks RPI_PICO_CLKID_CLK_REF>;
398			status = "disabled";
399		};
400
401		dma: dma@50000000 {
402			compatible = "raspberrypi,pico-dma";
403			reg = <0x50000000 DT_SIZE_K(64)>;
404			resets = <&reset RPI_PICO_RESETS_RESET_DMA>;
405			clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>;
406			interrupts = <10 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
407				     <11 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
408				     <12 RPI_PICO_DEFAULT_IRQ_PRIORITY>,
409				     <13 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
410			interrupt-names = "dma0", "dma1", "dma2", "dma3";
411			dma-channels = <16>;
412			status = "disabled";
413			#dma-cells = <3>;
414		};
415
416		usbd: usbd@50100000 {
417			compatible = "raspberrypi,pico-usbd";
418			reg = <0x50100000 0x10000>;
419			resets = <&reset RPI_PICO_RESETS_RESET_USBCTRL>;
420			clocks = <&clocks RPI_PICO_CLKID_CLK_USB>;
421			interrupts = <14 RPI_PICO_DEFAULT_IRQ_PRIORITY>;
422			interrupt-names = "usbctrl";
423			num-bidir-endpoints = <16>;
424			status = "disabled";
425		};
426
427		pio0: pio@50200000 {
428			compatible = "raspberrypi,pico-pio";
429			reg = <0x50200000 DT_SIZE_K(4)>;
430			clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>;
431			resets = <&reset RPI_PICO_RESETS_RESET_PIO0>;
432			status = "disabled";
433		};
434
435		pio1: pio@50300000 {
436			compatible = "raspberrypi,pico-pio";
437			reg = <0x50300000 DT_SIZE_K(4)>;
438			clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>;
439			resets = <&reset RPI_PICO_RESETS_RESET_PIO1>;
440			status = "disabled";
441		};
442
443		pio2: pio@50400000 {
444			compatible = "raspberrypi,pico-pio";
445			reg = <0x50400000 DT_SIZE_K(4)>;
446			clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>;
447			resets = <&reset RPI_PICO_RESETS_RESET_PIO2>;
448			status = "disabled";
449		};
450	};
451
452	pinctrl: pin-controller {
453		compatible = "raspberrypi,pico-pinctrl";
454		status = "okay";
455	};
456
457	die_temp: dietemp {
458		compatible = "raspberrypi,pico-temp";
459		status = "disabled";
460	};
461};
462