Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions drivers/audio/dmic_nrfx_pdm.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,15 @@
#define DMIC_NRFX_CLOCK_FACTOR 8192
#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP_OR(NODE_AUDIOPLL, frequency, 0)
#elif DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
#define DMIC_NRFX_AUDIO_CLOCK_FREQ DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
BUILD_ASSERT((DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_48K) ||
(DMIC_NRFX_AUDIO_CLOCK_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1),
#define AUXPLL_FREQUENCY_SETTING DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
BUILD_ASSERT((AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_48K) ||
(AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1),
"Unsupported Audio AUXPLL frequency selection for PDM");

Check notice on line 31 in drivers/audio/dmic_nrfx_pdm.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/audio/dmic_nrfx_pdm.c:31 - (AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1), - "Unsupported Audio AUXPLL frequency selection for PDM"); + (AUXPLL_FREQUENCY_SETTING == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1), + "Unsupported Audio AUXPLL frequency selection for PDM");
#define DMIC_NRFX_AUDIO_CLOCK_FREQ CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL)

#define DMIC_NRFX_CLOCK_FREQ MHZ(32)

#else
#define DMIC_NRFX_CLOCK_FREQ MHZ(32)
#define DMIC_NRFX_CLOCK_FACTOR 4096
Expand Down
48 changes: 33 additions & 15 deletions drivers/i2s/i2s_nrf_tdm.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <hal/nrf_tdm.h>
#include <haly/nrfy_gpio.h>
#include <zephyr/drivers/clock_control/nrf_clock_control.h>
#include <zephyr/dt-bindings/clock/nrf-auxpll.h>
#include <zephyr/drivers/i2s.h>
#include <zephyr/drivers/pinctrl.h>
#include <zephyr/irq.h>
Expand Down Expand Up @@ -47,12 +48,14 @@
#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(audiopll))
#define NODE_ACLK DT_NODELABEL(audiopll)
#define ACLK_FREQUENCY DT_PROP_OR(NODE_ACLK, frequency, 0)

static const struct device *audiopll = DEVICE_DT_GET(NODE_ACLK);
static const struct nrf_clock_spec aclk_spec = {
.frequency = ACLK_FREQUENCY,
};
#elif DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(audio_auxpll))
#define NODE_AUDIO_AUXPLL DT_NODELABEL(audio_auxpll)
#define ACLK_NORDIC_FREQUENCY DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
BUILD_ASSERT((ACLK_NORDIC_FREQUENCY == NRF_AUXPLL_FREQ_DIV_AUDIO_48K) ||
(ACLK_NORDIC_FREQUENCY == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1),
"Unsupported Audio AUXPLL frequency selection for TDM");
#define ACLK_FREQUENCY CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL)
#elif DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(aclk))

Check notice on line 58 in drivers/i2s/i2s_nrf_tdm.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/i2s/i2s_nrf_tdm.c:58 - (ACLK_NORDIC_FREQUENCY == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1), + (ACLK_NORDIC_FREQUENCY == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1), "Unsupported Audio AUXPLL frequency selection for TDM"); -#define ACLK_FREQUENCY CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL) +#define ACLK_FREQUENCY CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL)
#define NODE_ACLK DT_NODELABEL(aclk)
#define ACLK_FREQUENCY DT_PROP_OR(NODE_ACLK, clock_frequency, 0)
#else
Expand Down Expand Up @@ -107,7 +110,10 @@
};

struct tdm_drv_data {
#if CONFIG_CLOCK_CONTROL_NRF
#if CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL || DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
const struct device *audiopll;
struct nrf_clock_spec aclk_spec;
#elif CONFIG_CLOCK_CONTROL_NRF
struct onoff_manager *clk_mgr;
#endif
struct onoff_client clk_cli;
Expand All @@ -132,8 +138,10 @@
{
#if DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRF
return onoff_request(drv_data->clk_mgr, &drv_data->clk_cli);
#elif DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
return nrf_clock_control_request(audiopll, &aclk_spec, &drv_data->clk_cli);
#elif (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL) || \
DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
return nrf_clock_control_request(drv_data->audiopll, &drv_data->aclk_spec,

Check notice on line 143 in drivers/i2s/i2s_nrf_tdm.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/i2s/i2s_nrf_tdm.c:143 -#elif (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL) || \ - DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL) +#elif (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL) || \ + DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
&drv_data->clk_cli);
#else
(void)drv_data;

Expand All @@ -145,10 +153,9 @@
{
#if DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRF
return onoff_release(drv_data->clk_mgr);
#elif DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
(void)drv_data;

return nrf_clock_control_release(audiopll, &aclk_spec);
#elif (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL) || \
DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
return nrf_clock_control_release(drv_data->audiopll, &drv_data->aclk_spec);

Check notice on line 158 in drivers/i2s/i2s_nrf_tdm.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/i2s/i2s_nrf_tdm.c:158 -#elif (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL) || \ - DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL) +#elif (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL) || \ + DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
#else
(void)drv_data;

Expand Down Expand Up @@ -1120,6 +1127,16 @@
subsys = CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO;
drv_data->clk_mgr = z_nrf_clock_control_get_onoff(subsys);
__ASSERT_NO_MSG(drv_data->clk_mgr != NULL);
#elif DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) && CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL
struct tdm_drv_data *drv_data = dev->data;

drv_data->audiopll = DEVICE_DT_GET(NODE_ACLK);
drv_data->aclk_spec.frequency = ACLK_FREQUENCY;
#elif DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)
struct tdm_drv_data *drv_data = dev->data;

drv_data->audiopll = DEVICE_DT_GET(NODE_AUDIO_AUXPLL);
drv_data->aclk_spec.frequency = ACLK_FREQUENCY;
#else
(void)dev;
#endif
Expand Down Expand Up @@ -1194,10 +1211,11 @@
clock_manager_init(dev); \
return 0; \
} \
BUILD_ASSERT((TDM_SCK_CLK_SRC(idx) != ACLK && TDM_MCK_CLK_SRC(idx) != ACLK) || \
DT_NODE_HAS_STATUS_OKAY(NODE_ACLK), \
"Clock source ACLK requires the audiopll node."); \
BUILD_ASSERT((TDM_SCK_CLK_SRC(idx) != ACLK && TDM_MCK_CLK_SRC(idx) != ACLK) || \
(DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) || \
DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)), \
"Clock source ACLK requires the audiopll/audio_auxpll node."); \
NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(TDM(idx)); \

Check notice on line 1218 in drivers/i2s/i2s_nrf_tdm.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/i2s/i2s_nrf_tdm.c:1218 - BUILD_ASSERT((TDM_SCK_CLK_SRC(idx) != ACLK && TDM_MCK_CLK_SRC(idx) != ACLK) || \ - (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) || \ - DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)), \ - "Clock source ACLK requires the audiopll/audio_auxpll node."); \ + BUILD_ASSERT((TDM_SCK_CLK_SRC(idx) != ACLK && TDM_MCK_CLK_SRC(idx) != ACLK) || \ + (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) || \ + DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)), \ + "Clock source ACLK requires the audiopll/audio_auxpll node."); \
DEVICE_DT_DEFINE(TDM(idx), tdm_nrf_init##idx, NULL, &tdm_nrf_data##idx, &tdm_nrf_cfg##idx, \
POST_KERNEL, CONFIG_I2S_INIT_PRIORITY, &tdm_nrf_drv_api);

Expand Down
23 changes: 23 additions & 0 deletions include/zephyr/drivers/clock_control/nrf_clock_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,29 @@
/* Specifies that default precision of the clock is sufficient. */
#define NRF_CLOCK_CONTROL_PRECISION_DEFAULT 0

/* AUXPLL devicetree takes in raw register values, these are the actual frequencies outputted */
#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_MIN_HZ 80000000
#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_44K1_HZ 11289591
#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_USB24M_HZ 24000000
#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_48K_HZ 12287963

/* Internal helper macro to map DT property value to output frequency */
#define _CLOCK_CONTROL_NRF_AUXPLL_MAP_FREQ(freq_val) \
((freq_val) == NRF_AUXPLL_FREQ_DIV_MIN ? \
CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_MIN_HZ : \
(freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ? \
CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_44K1_HZ : \
(freq_val) == NRF_AUXPLL_FREQ_DIV_USB24M ? \
CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_USB24M_HZ : \
(freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_48K ? \
CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_48K_HZ : 0)

/* Public macro to get output frequency of AUXPLL */
#define CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(node) \
COND_CODE_1(DT_NODE_HAS_PROP(node, nordic_frequency), \

Check notice on line 210 in include/zephyr/drivers/clock_control/nrf_clock_control.h

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

include/zephyr/drivers/clock_control/nrf_clock_control.h:210 -#define _CLOCK_CONTROL_NRF_AUXPLL_MAP_FREQ(freq_val) \ - ((freq_val) == NRF_AUXPLL_FREQ_DIV_MIN ? \ - CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_MIN_HZ : \ - (freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ? \ - CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_44K1_HZ : \ - (freq_val) == NRF_AUXPLL_FREQ_DIV_USB24M ? \ - CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_USB24M_HZ : \ - (freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_48K ? \ - CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_48K_HZ : 0) +#define _CLOCK_CONTROL_NRF_AUXPLL_MAP_FREQ(freq_val) \ + ((freq_val) == NRF_AUXPLL_FREQ_DIV_MIN ? CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_MIN_HZ \ + : (freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 \ + ? CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_44K1_HZ \ + : (freq_val) == NRF_AUXPLL_FREQ_DIV_USB24M ? CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_USB24M_HZ \ + : (freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_48K \ + ? CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_48K_HZ \ + : 0) /* Public macro to get output frequency of AUXPLL */ -#define CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(node) \ +#define CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(node) \
(_CLOCK_CONTROL_NRF_AUXPLL_MAP_FREQ(DT_PROP(node, nordic_frequency))), \
(0))

struct nrf_clock_spec {
uint32_t frequency;
uint16_t accuracy : 15;
Expand Down
15 changes: 4 additions & 11 deletions tests/drivers/clock_control/nrf_clock_control/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,17 +162,10 @@
#define AUXPLL_NODE DT_INST(0, AUXPLL_COMPAT)
#define AUXPLL_FREQ DT_PROP(AUXPLL_NODE, nordic_frequency)

/* Gets selected AUXPLL DIV and selects the expected frequency */
#if AUXPLL_FREQ == NRF_AUXPLL_FREQUENCY_DIV_MIN
#define AUXPLL_FREQ_OUT 80000000
#elif AUXPLL_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1
#define AUXPLL_FREQ_OUT 11289591
#elif AUXPLL_FREQ == NRF_AUXPLL_FREQ_DIV_USB_24M
#define AUXPLL_FREQ_OUT 24000000
#elif AUXPLL_FREQ == NRF_AUXPLL_FREQ_DIV_AUDIO_48K
#define AUXPLL_FREQ_OUT 12287963
#else
/*No use case for NRF_AUXPLL_FREQ_DIV_MAX or others yet*/

Check notice on line 165 in tests/drivers/clock_control/nrf_clock_control/src/main.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

tests/drivers/clock_control/nrf_clock_control/src/main.c:165 -
/* Gets expected AUXPLL frequency */
#define AUXPLL_FREQ_OUT CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(AUXPLL_NODE)
#if AUXPLL_FREQ_OUT == 0
#error "Unsupported AUXPLL frequency selection"
#endif

Expand Down
3 changes: 3 additions & 0 deletions tests/drivers/i2s/i2s_api/src/test_i2s_errors.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ ZTEST_USER(i2s_errors, test_i2s_config_attempt_in_wrong_state)
err = i2s_trigger(dev_i2s, I2S_DIR_TX, I2S_TRIGGER_STOP);
zassert_equal(err, 0, "I2S_TRIGGER_STOP unexpected error: %d", err);

err = i2s_trigger(dev_i2s, I2S_DIR_TX, I2S_TRIGGER_DROP);
zassert_equal(err, 0, "I2S_TRIGGER_DROP unexpected error: %d", err);

zassert_not_equal(
config_err, 0,
"I2S configuration should not be possible in states other than I2S_STATE_READY");
Expand Down
Loading