10
10
#include <zephyr/drivers/clock_control.h>
11
11
#include <zephyr/drivers/pinctrl.h>
12
12
#include <zephyr/drivers/reset.h>
13
- #include <zephyr/dt-bindings/clock/rpi_pico_clock.h>
13
+ #if defined(CONFIG_SOC_SERIES_RP2040 )
14
+ #include <zephyr/dt-bindings/clock/rpi_pico_rp2040_clock.h>
15
+ #else
16
+ #include <zephyr/dt-bindings/clock/rpi_pico_rp2350_clock.h>
17
+ #endif
14
18
15
19
#include <hardware/clocks.h>
16
20
#include <hardware/xosc.h>
77
81
#define CLOCK_FREQ_clk_gpout1 DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_gpout1), clock_frequency)
78
82
#define CLOCK_FREQ_clk_gpout2 DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_gpout2), clock_frequency)
79
83
#define CLOCK_FREQ_clk_gpout3 DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_gpout3), clock_frequency)
84
+ #define CLOCK_FREQ_clk_hstx DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_hstx), clock_frequency)
80
85
#define CLOCK_FREQ_clk_ref DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_ref), clock_frequency)
81
86
#define CLOCK_FREQ_clk_sys DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_sys), clock_frequency)
82
87
#define CLOCK_FREQ_clk_usb DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_usb), clock_frequency)
102
107
#define AUXSRC_clk_sys CLK_SYS
103
108
#define AUXSRC_clk_usb CLK_USB
104
109
#define AUXSRC_clk_adc CLK_ADC
105
- #define AUXSRC_clk_rtc CLK_RTC
106
110
#define AUXSRC_clk_gpin0 CLKSRC_GPIN0
107
111
#define AUXSRC_clk_gpin1 CLKSRC_GPIN1
112
+ #if defined(CONFIG_SOC_SERIES_RP2040 )
113
+ #define AUXSRC_clk_rtc CLK_RTC
114
+ #else
115
+ #define AUXSRC_pll_usb_primary_ref_opcg CLKSRC_PLL_PLL_USB_PRIMARY_REF_OPCG
116
+ #define AUXSRC_lposc LPOSC_CLKSRC
117
+ #define AUXSRC_clk_hstx CLK_HSTX
118
+ #define AUXSRC_otp_clk2fc OTP_CLK2FC
119
+ #endif
108
120
109
121
#define AUXSTEM_clk_gpout0 CLOCKS_CLK_GPOUT0_CTRL_AUXSRC_VALUE_
110
122
#define AUXSTEM_clk_gpout1 CLOCKS_CLK_GPOUT1_CTRL_AUXSRC_VALUE_
114
126
#define AUXSTEM_clk_sys CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_
115
127
#define AUXSTEM_clk_usb CLOCKS_CLK_USB_CTRL_AUXSRC_VALUE_
116
128
#define AUXSTEM_clk_adc CLOCKS_CLK_ADC_CTRL_AUXSRC_VALUE_
117
- #define AUXSTEM_clk_rtc CLOCKS_CLK_RTC_CTRL_AUXSRC_VALUE_
118
- #define AUXSTEM_clk_peri CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_
129
+ #define AUXSTEM_clk_peri CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_
130
+ #if defined(CONFIG_SOC_SERIES_RP2040 )
131
+ #define AUXSTEM_clk_rtc CLOCKS_CLK_RTC_CTRL_AUXSRC_VALUE_
132
+ #else
133
+ #define AUXSTEM_clk_hstx CLOCKS_CLK_HSTX_CTRL_AUXSRC_VALUE_
134
+ #endif
119
135
120
136
#define TUPLE_ENTRY (n , p , i ) \
121
137
{ \
@@ -141,7 +157,9 @@ enum rpi_pico_clkid {
141
157
rpi_pico_clkid_clk_peri = RPI_PICO_CLKID_CLK_PERI ,
142
158
rpi_pico_clkid_clk_usb = RPI_PICO_CLKID_CLK_USB ,
143
159
rpi_pico_clkid_clk_adc = RPI_PICO_CLKID_CLK_ADC ,
160
+ #if defined(RPI_PICO_CLKID_CLK_RTC )
144
161
rpi_pico_clkid_clk_rtc = RPI_PICO_CLKID_CLK_RTC ,
162
+ #endif
145
163
rpi_pico_clkid_pll_sys = RPI_PICO_CLKID_PLL_SYS ,
146
164
rpi_pico_clkid_pll_usb = RPI_PICO_CLKID_PLL_USB ,
147
165
rpi_pico_clkid_xosc = RPI_PICO_CLKID_XOSC ,
@@ -223,9 +241,11 @@ uint64_t rpi_pico_frequency_count(const struct device *dev, clock_control_subsys
223
241
case rpi_pico_clkid_clk_adc :
224
242
fc0_id = CLOCKS_FC0_SRC_VALUE_CLK_ADC ;
225
243
break ;
244
+ #if defined(CONFIG_SOC_SERIES_RP2040 )
226
245
case rpi_pico_clkid_clk_rtc :
227
246
fc0_id = CLOCKS_FC0_SRC_VALUE_CLK_RTC ;
228
247
break ;
248
+ #endif
229
249
case rpi_pico_clkid_pll_sys :
230
250
fc0_id = CLOCKS_FC0_SRC_VALUE_PLL_SYS_CLKSRC_PRIMARY ;
231
251
break ;
@@ -284,10 +304,13 @@ static int rpi_pico_rosc_write(const struct device *dev, io_rw_32 *addr, uint32_
284
304
static enum rpi_pico_clkid rpi_pico_get_clock_src (const struct device * dev , enum rpi_pico_clkid id )
285
305
{
286
306
const struct clock_control_rpi_pico_config * config = dev -> config ;
287
- enum rpi_pico_clkid srcid = rpi_pico_clkid_none ;
307
+ enum rpi_pico_clkid srcid ;
288
308
289
- if (id == rpi_pico_clkid_clk_gpout0 || id == rpi_pico_clkid_clk_gpout1 ||
290
- id == rpi_pico_clkid_clk_gpout2 || id == rpi_pico_clkid_clk_gpout3 ) {
309
+ switch (id ) {
310
+ case rpi_pico_clkid_clk_gpout0 :
311
+ case rpi_pico_clkid_clk_gpout1 :
312
+ case rpi_pico_clkid_clk_gpout2 :
313
+ case rpi_pico_clkid_clk_gpout3 : {
291
314
const static enum rpi_pico_clkid table [] = {
292
315
rpi_pico_clkid_pll_sys ,
293
316
rpi_pico_clkid_gpin0 ,
@@ -298,15 +321,19 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
298
321
rpi_pico_clkid_clk_sys ,
299
322
rpi_pico_clkid_clk_usb ,
300
323
rpi_pico_clkid_clk_adc ,
324
+ #if defined(CONFIG_SOC_SERIES_RP2040 )
301
325
rpi_pico_clkid_clk_rtc ,
326
+ #endif
302
327
rpi_pico_clkid_clk_ref ,
303
328
};
304
329
305
330
clock_hw_t * clock_hw = & config -> clocks_regs -> clk [id ];
306
331
uint32_t aux = ((clock_hw -> ctrl & CTRL_AUXSRC_BITS ) >> CTRL_AUXSRC_LSB );
307
332
308
333
srcid = table [aux ];
309
- } else if (id == rpi_pico_clkid_clk_ref ) {
334
+ break ;
335
+ }
336
+ case rpi_pico_clkid_clk_ref : {
310
337
const static enum rpi_pico_clkid table [] = {
311
338
rpi_pico_clkid_pll_usb ,
312
339
rpi_pico_clkid_gpin0 ,
@@ -324,7 +351,9 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
324
351
} else {
325
352
srcid = table [aux ];
326
353
}
327
- } else if (id == rpi_pico_clkid_clk_sys ) {
354
+ break ;
355
+ }
356
+ case rpi_pico_clkid_clk_sys : {
328
357
const static enum rpi_pico_clkid table [] = {
329
358
rpi_pico_clkid_pll_sys ,
330
359
rpi_pico_clkid_pll_usb ,
@@ -343,7 +372,9 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
343
372
} else {
344
373
srcid = table [aux ];
345
374
}
346
- } else if (id == rpi_pico_clkid_clk_peri ) {
375
+ break ;
376
+ }
377
+ case rpi_pico_clkid_clk_peri : {
347
378
const static enum rpi_pico_clkid table [] = {
348
379
rpi_pico_clkid_clk_sys ,
349
380
rpi_pico_clkid_pll_sys ,
@@ -358,8 +389,16 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
358
389
uint32_t aux = ((clock_hw -> ctrl & CTRL_AUXSRC_BITS ) >> CTRL_AUXSRC_LSB );
359
390
360
391
srcid = table [aux ];
361
- } else if (id == rpi_pico_clkid_clk_usb || id == rpi_pico_clkid_clk_adc ||
362
- id == rpi_pico_clkid_clk_rtc ) {
392
+ break ;
393
+ }
394
+ case rpi_pico_clkid_clk_usb :
395
+ case rpi_pico_clkid_clk_adc :
396
+ #if defined(RPI_PICO_CLKID_CLK_RTC )
397
+ case rpi_pico_clkid_clk_rtc :
398
+ #else
399
+
400
+ #endif
401
+ {
363
402
const static enum rpi_pico_clkid table [] = {
364
403
rpi_pico_clkid_pll_usb ,
365
404
rpi_pico_clkid_pll_sys ,
@@ -373,8 +412,16 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
373
412
uint32_t aux = ((clock_hw -> ctrl & CTRL_AUXSRC_BITS ) >> CTRL_AUXSRC_LSB );
374
413
375
414
srcid = table [aux ];
376
- } else if (id == rpi_pico_clkid_pll_sys || id == rpi_pico_clkid_pll_usb ) {
415
+ break ;
416
+ }
417
+ case rpi_pico_clkid_pll_sys :
418
+ case rpi_pico_clkid_pll_usb : {
377
419
srcid = rpi_pico_clkid_xosc ;
420
+ break ;
421
+ }
422
+ default :
423
+ srcid = rpi_pico_clkid_none ;
424
+ break ;
378
425
}
379
426
380
427
return srcid ;
@@ -396,7 +443,9 @@ static bool rpi_pico_is_clock_enabled(const struct device *dev, enum rpi_pico_cl
396
443
} else if (id == rpi_pico_clkid_clk_usb ||
397
444
id == rpi_pico_clkid_clk_peri ||
398
445
id == rpi_pico_clkid_clk_adc ||
446
+ #if defined(RPI_PICO_CLKID_CLK_RTC )
399
447
id == rpi_pico_clkid_clk_rtc ||
448
+ #endif
400
449
id == rpi_pico_clkid_clk_gpout0 ||
401
450
id == rpi_pico_clkid_clk_gpout1 ||
402
451
id == rpi_pico_clkid_clk_gpout2 ||
@@ -444,7 +493,9 @@ static float rpi_pico_calc_clock_freq(const struct device *dev, enum rpi_pico_cl
444
493
if (id == rpi_pico_clkid_clk_sys ||
445
494
id == rpi_pico_clkid_clk_usb ||
446
495
id == rpi_pico_clkid_clk_adc ||
496
+ #if defined(RPI_PICO_CLKID_CLK_RTC )
447
497
id == rpi_pico_clkid_clk_rtc ||
498
+ #endif
448
499
id == rpi_pico_clkid_clk_ref ||
449
500
id == rpi_pico_clkid_clk_gpout0 ||
450
501
id == rpi_pico_clkid_clk_gpout1 ||
@@ -611,13 +662,19 @@ static int clock_control_rpi_pico_init(const struct device *dev)
611
662
RESETS_RESET_SYSCFG_BITS | RESETS_RESET_PLL_SYS_BITS ));
612
663
613
664
unreset_block_wait (RESETS_RESET_BITS &
614
- ~(RESETS_RESET_ADC_BITS | RESETS_RESET_RTC_BITS |
665
+ ~(RESETS_RESET_ADC_BITS |
666
+ #if defined(RESETS_RESET_RTC_BITS )
667
+ RESETS_RESET_RTC_BITS |
668
+ #endif
669
+ #if defined(RESETS_RESET_HSTX_BITS )
670
+ RESETS_RESET_HSTX_BITS |
671
+ #endif
615
672
RESETS_RESET_SPI0_BITS | RESETS_RESET_SPI1_BITS |
616
673
RESETS_RESET_UART0_BITS | RESETS_RESET_UART1_BITS |
617
674
RESETS_RESET_USBCTRL_BITS ));
618
675
619
676
/* Start tick in watchdog */
620
- watchdog_hw -> tick = (( CLOCK_FREQ_xosc / 1000000 ) | WATCHDOG_TICK_ENABLE_BITS );
677
+ watchdog_start_tick ( CLOCK_FREQ_xosc / 1000000 );
621
678
622
679
clocks_regs -> resus .ctrl = 0 ;
623
680
@@ -755,8 +812,10 @@ BUILD_ASSERT(SRC_CLOCK_FREQ(clk_usb) >= CLOCK_FREQ_clk_usb,
755
812
"clk_usb: clock divider is out of range" );
756
813
BUILD_ASSERT (SRC_CLOCK_FREQ (clk_adc ) >= CLOCK_FREQ_clk_adc ,
757
814
"clk_adc: clock divider is out of range" );
815
+ #if defined(CONFIG_SOC_SERIES_RP2040 )
758
816
BUILD_ASSERT (SRC_CLOCK_FREQ (clk_rtc ) >= CLOCK_FREQ_clk_rtc ,
759
817
"clk_rtc: clock divider is out of range" );
818
+ #endif
760
819
BUILD_ASSERT (SRC_CLOCK_FREQ (clk_peri ) >= CLOCK_FREQ_clk_peri ,
761
820
"clk_peri: clock divider is out of range" );
762
821
@@ -838,12 +897,21 @@ static const struct clock_control_rpi_pico_config clock_control_rpi_pico_config
838
897
.source_rate = SRC_CLOCK_FREQ (clk_adc ),
839
898
.rate = CLOCK_FREQ (clk_adc ),
840
899
},
900
+ #if defined(RPI_PICO_CLKID_CLK_RTC )
841
901
[RPI_PICO_CLKID_CLK_RTC ] = {
842
902
.source = 0 ,
843
903
.aux_source = CLOCK_AUX_SOURCE (clk_rtc ),
844
904
.source_rate = SRC_CLOCK_FREQ (clk_rtc ),
845
905
.rate = CLOCK_FREQ (clk_rtc ),
846
906
},
907
+ #elif defined(RPI_PICO_CLKID_CLK_HSTX )
908
+ [RPI_PICO_CLKID_CLK_HSTX ] = {
909
+ .source = 0 ,
910
+ .aux_source = CLOCK_AUX_SOURCE (clk_hstx ),
911
+ .source_rate = SRC_CLOCK_FREQ (clk_hstx ),
912
+ .rate = CLOCK_FREQ (clk_hstx ),
913
+ },
914
+ #endif
847
915
},
848
916
.plls_data = {
849
917
[RPI_PICO_PLL_SYS ] = {
0 commit comments