Skip to content

Commit 122784d

Browse files
ajf58kartben
authored andcommitted
drivers: clock_control: rpi_pico: Add support for the RP2350.
Add support for SoC-specific clock ids and update the initialization function to support the existing RP2040 and add support for the RP2350. clock_control_rpi_pico.c uses numerical values for clock ids taken from rpi_pico_clock.h which are the "clock generator". For the RP2350 these values are different for some of the same logical clock sources, as well as the RP2040 and RP2350 having different clock sources available. Signed-off-by: Andrew Featherstone <andrew.featherstone@gmail.com>
1 parent 0603637 commit 122784d

File tree

5 files changed

+118
-22
lines changed

5 files changed

+118
-22
lines changed

drivers/clock_control/clock_control_rpi_pico.c

+83-15
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
#include <zephyr/drivers/clock_control.h>
1111
#include <zephyr/drivers/pinctrl.h>
1212
#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
1418

1519
#include <hardware/clocks.h>
1620
#include <hardware/xosc.h>
@@ -77,6 +81,7 @@
7781
#define CLOCK_FREQ_clk_gpout1 DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_gpout1), clock_frequency)
7882
#define CLOCK_FREQ_clk_gpout2 DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_gpout2), clock_frequency)
7983
#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)
8085
#define CLOCK_FREQ_clk_ref DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_ref), clock_frequency)
8186
#define CLOCK_FREQ_clk_sys DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_sys), clock_frequency)
8287
#define CLOCK_FREQ_clk_usb DT_PROP(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_usb), clock_frequency)
@@ -102,9 +107,16 @@
102107
#define AUXSRC_clk_sys CLK_SYS
103108
#define AUXSRC_clk_usb CLK_USB
104109
#define AUXSRC_clk_adc CLK_ADC
105-
#define AUXSRC_clk_rtc CLK_RTC
106110
#define AUXSRC_clk_gpin0 CLKSRC_GPIN0
107111
#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
108120

109121
#define AUXSTEM_clk_gpout0 CLOCKS_CLK_GPOUT0_CTRL_AUXSRC_VALUE_
110122
#define AUXSTEM_clk_gpout1 CLOCKS_CLK_GPOUT1_CTRL_AUXSRC_VALUE_
@@ -114,8 +126,12 @@
114126
#define AUXSTEM_clk_sys CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_
115127
#define AUXSTEM_clk_usb CLOCKS_CLK_USB_CTRL_AUXSRC_VALUE_
116128
#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
119135

120136
#define TUPLE_ENTRY(n, p, i) \
121137
{ \
@@ -141,7 +157,9 @@ enum rpi_pico_clkid {
141157
rpi_pico_clkid_clk_peri = RPI_PICO_CLKID_CLK_PERI,
142158
rpi_pico_clkid_clk_usb = RPI_PICO_CLKID_CLK_USB,
143159
rpi_pico_clkid_clk_adc = RPI_PICO_CLKID_CLK_ADC,
160+
#if defined(RPI_PICO_CLKID_CLK_RTC)
144161
rpi_pico_clkid_clk_rtc = RPI_PICO_CLKID_CLK_RTC,
162+
#endif
145163
rpi_pico_clkid_pll_sys = RPI_PICO_CLKID_PLL_SYS,
146164
rpi_pico_clkid_pll_usb = RPI_PICO_CLKID_PLL_USB,
147165
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
223241
case rpi_pico_clkid_clk_adc:
224242
fc0_id = CLOCKS_FC0_SRC_VALUE_CLK_ADC;
225243
break;
244+
#if defined(CONFIG_SOC_SERIES_RP2040)
226245
case rpi_pico_clkid_clk_rtc:
227246
fc0_id = CLOCKS_FC0_SRC_VALUE_CLK_RTC;
228247
break;
248+
#endif
229249
case rpi_pico_clkid_pll_sys:
230250
fc0_id = CLOCKS_FC0_SRC_VALUE_PLL_SYS_CLKSRC_PRIMARY;
231251
break;
@@ -284,10 +304,13 @@ static int rpi_pico_rosc_write(const struct device *dev, io_rw_32 *addr, uint32_
284304
static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum rpi_pico_clkid id)
285305
{
286306
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;
288308

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: {
291314
const static enum rpi_pico_clkid table[] = {
292315
rpi_pico_clkid_pll_sys,
293316
rpi_pico_clkid_gpin0,
@@ -298,15 +321,19 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
298321
rpi_pico_clkid_clk_sys,
299322
rpi_pico_clkid_clk_usb,
300323
rpi_pico_clkid_clk_adc,
324+
#if defined(CONFIG_SOC_SERIES_RP2040)
301325
rpi_pico_clkid_clk_rtc,
326+
#endif
302327
rpi_pico_clkid_clk_ref,
303328
};
304329

305330
clock_hw_t *clock_hw = &config->clocks_regs->clk[id];
306331
uint32_t aux = ((clock_hw->ctrl & CTRL_AUXSRC_BITS) >> CTRL_AUXSRC_LSB);
307332

308333
srcid = table[aux];
309-
} else if (id == rpi_pico_clkid_clk_ref) {
334+
break;
335+
}
336+
case rpi_pico_clkid_clk_ref: {
310337
const static enum rpi_pico_clkid table[] = {
311338
rpi_pico_clkid_pll_usb,
312339
rpi_pico_clkid_gpin0,
@@ -324,7 +351,9 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
324351
} else {
325352
srcid = table[aux];
326353
}
327-
} else if (id == rpi_pico_clkid_clk_sys) {
354+
break;
355+
}
356+
case rpi_pico_clkid_clk_sys: {
328357
const static enum rpi_pico_clkid table[] = {
329358
rpi_pico_clkid_pll_sys,
330359
rpi_pico_clkid_pll_usb,
@@ -343,7 +372,9 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
343372
} else {
344373
srcid = table[aux];
345374
}
346-
} else if (id == rpi_pico_clkid_clk_peri) {
375+
break;
376+
}
377+
case rpi_pico_clkid_clk_peri: {
347378
const static enum rpi_pico_clkid table[] = {
348379
rpi_pico_clkid_clk_sys,
349380
rpi_pico_clkid_pll_sys,
@@ -358,8 +389,16 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
358389
uint32_t aux = ((clock_hw->ctrl & CTRL_AUXSRC_BITS) >> CTRL_AUXSRC_LSB);
359390

360391
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+
{
363402
const static enum rpi_pico_clkid table[] = {
364403
rpi_pico_clkid_pll_usb,
365404
rpi_pico_clkid_pll_sys,
@@ -373,8 +412,16 @@ static enum rpi_pico_clkid rpi_pico_get_clock_src(const struct device *dev, enum
373412
uint32_t aux = ((clock_hw->ctrl & CTRL_AUXSRC_BITS) >> CTRL_AUXSRC_LSB);
374413

375414
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: {
377419
srcid = rpi_pico_clkid_xosc;
420+
break;
421+
}
422+
default:
423+
srcid = rpi_pico_clkid_none;
424+
break;
378425
}
379426

380427
return srcid;
@@ -396,7 +443,9 @@ static bool rpi_pico_is_clock_enabled(const struct device *dev, enum rpi_pico_cl
396443
} else if (id == rpi_pico_clkid_clk_usb ||
397444
id == rpi_pico_clkid_clk_peri ||
398445
id == rpi_pico_clkid_clk_adc ||
446+
#if defined(RPI_PICO_CLKID_CLK_RTC)
399447
id == rpi_pico_clkid_clk_rtc ||
448+
#endif
400449
id == rpi_pico_clkid_clk_gpout0 ||
401450
id == rpi_pico_clkid_clk_gpout1 ||
402451
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
444493
if (id == rpi_pico_clkid_clk_sys ||
445494
id == rpi_pico_clkid_clk_usb ||
446495
id == rpi_pico_clkid_clk_adc ||
496+
#if defined(RPI_PICO_CLKID_CLK_RTC)
447497
id == rpi_pico_clkid_clk_rtc ||
498+
#endif
448499
id == rpi_pico_clkid_clk_ref ||
449500
id == rpi_pico_clkid_clk_gpout0 ||
450501
id == rpi_pico_clkid_clk_gpout1 ||
@@ -611,13 +662,19 @@ static int clock_control_rpi_pico_init(const struct device *dev)
611662
RESETS_RESET_SYSCFG_BITS | RESETS_RESET_PLL_SYS_BITS));
612663

613664
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
615672
RESETS_RESET_SPI0_BITS | RESETS_RESET_SPI1_BITS |
616673
RESETS_RESET_UART0_BITS | RESETS_RESET_UART1_BITS |
617674
RESETS_RESET_USBCTRL_BITS));
618675

619676
/* Start tick in watchdog */
620-
watchdog_hw->tick = ((CLOCK_FREQ_xosc/1000000) | WATCHDOG_TICK_ENABLE_BITS);
677+
watchdog_start_tick(CLOCK_FREQ_xosc / 1000000);
621678

622679
clocks_regs->resus.ctrl = 0;
623680

@@ -755,8 +812,10 @@ BUILD_ASSERT(SRC_CLOCK_FREQ(clk_usb) >= CLOCK_FREQ_clk_usb,
755812
"clk_usb: clock divider is out of range");
756813
BUILD_ASSERT(SRC_CLOCK_FREQ(clk_adc) >= CLOCK_FREQ_clk_adc,
757814
"clk_adc: clock divider is out of range");
815+
#if defined(CONFIG_SOC_SERIES_RP2040)
758816
BUILD_ASSERT(SRC_CLOCK_FREQ(clk_rtc) >= CLOCK_FREQ_clk_rtc,
759817
"clk_rtc: clock divider is out of range");
818+
#endif
760819
BUILD_ASSERT(SRC_CLOCK_FREQ(clk_peri) >= CLOCK_FREQ_clk_peri,
761820
"clk_peri: clock divider is out of range");
762821

@@ -838,12 +897,21 @@ static const struct clock_control_rpi_pico_config clock_control_rpi_pico_config
838897
.source_rate = SRC_CLOCK_FREQ(clk_adc),
839898
.rate = CLOCK_FREQ(clk_adc),
840899
},
900+
#if defined(RPI_PICO_CLKID_CLK_RTC)
841901
[RPI_PICO_CLKID_CLK_RTC] = {
842902
.source = 0,
843903
.aux_source = CLOCK_AUX_SOURCE(clk_rtc),
844904
.source_rate = SRC_CLOCK_FREQ(clk_rtc),
845905
.rate = CLOCK_FREQ(clk_rtc),
846906
},
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
847915
},
848916
.plls_data = {
849917
[RPI_PICO_PLL_SYS] = {

dts/arm/raspberrypi/rpi_pico/rp2040.dtsi

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <arm/armv6-m.dtsi>
88
#include <zephyr/dt-bindings/adc/adc.h>
99
#include <zephyr/dt-bindings/gpio/gpio.h>
10-
#include <zephyr/dt-bindings/clock/rpi_pico_clock.h>
10+
#include <zephyr/dt-bindings/clock/rpi_pico_rp2040_clock.h>
1111
#include <zephyr/dt-bindings/i2c/i2c.h>
1212
#include <zephyr/dt-bindings/regulator/rpi_pico.h>
1313
#include <zephyr/dt-bindings/reset/rp2040_reset.h>

include/zephyr/dt-bindings/clock/rpi_pico_clock.h renamed to include/zephyr/dt-bindings/clock/rpi_pico_clock_common.h

+4-6
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
6-
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_CLOCK_H_
7-
#define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_CLOCK_H_
6+
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_CLOCK_COMMON_H_
7+
#define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_CLOCK_COMMON_H_
88

99
#define RPI_PICO_PLL_SYS 0
1010
#define RPI_PICO_PLL_USB 1
@@ -21,9 +21,7 @@
2121
#define RPI_PICO_CLKID_CLK_REF 4
2222
#define RPI_PICO_CLKID_CLK_SYS 5
2323
#define RPI_PICO_CLKID_CLK_PERI 6
24-
#define RPI_PICO_CLKID_CLK_USB 7
25-
#define RPI_PICO_CLKID_CLK_ADC 8
26-
#define RPI_PICO_CLKID_CLK_RTC 9
24+
/* N.b. clock ids 7-9 are defined in SoC-specific files. */
2725

2826
#define RPI_PICO_CLKID_PLL_SYS 10
2927
#define RPI_PICO_CLKID_PLL_USB 11
@@ -41,4 +39,4 @@
4139

4240
#define RPI_PICO_CLOCK_COUNT 10
4341

44-
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_CLOCK_H_ */
42+
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_CLOCK_COMMON_H_ */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright (c) 2022 Andrei-Edward Popa
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_RP2040_CLOCK_H_
7+
#define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_RP2040_CLOCK_H_
8+
9+
#include "rpi_pico_clock_common.h"
10+
11+
#define RPI_PICO_CLKID_CLK_USB 7
12+
#define RPI_PICO_CLKID_CLK_ADC 8
13+
#define RPI_PICO_CLKID_CLK_RTC 9
14+
15+
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_RP2040_CLOCK_H_ */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright (c) 2024 Andrew Featherstone
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_RP2350_CLOCK_H_
7+
#define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_RP2350_CLOCK_H_
8+
9+
#include "rpi_pico_clock_common.h"
10+
11+
#define RPI_PICO_CLKID_CLK_HSTX 7
12+
#define RPI_PICO_CLKID_CLK_USB 8
13+
#define RPI_PICO_CLKID_CLK_ADC 9
14+
15+
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_RPI_PICO_RP2350_CLOCK_H_ */

0 commit comments

Comments
 (0)