1010#include  <hal/nrf_tdm.h> 
1111#include  <haly/nrfy_gpio.h> 
1212#include  <zephyr/drivers/clock_control/nrf_clock_control.h> 
13+ #include  <zephyr/dt-bindings/clock/nrf-auxpll.h> 
1314#include  <zephyr/drivers/i2s.h> 
1415#include  <zephyr/drivers/pinctrl.h> 
1516#include  <zephyr/irq.h> 
@@ -47,11 +48,13 @@ LOG_MODULE_REGISTER(tdm_nrf, CONFIG_I2S_LOG_LEVEL);
4748#if  DT_NODE_HAS_STATUS_OKAY (DT_NODELABEL (audiopll ))
4849#define  NODE_ACLK       DT_NODELABEL(audiopll)
4950#define  ACLK_FREQUENCY  DT_PROP_OR(NODE_ACLK, frequency, 0)
50- 
51- static  const  struct  device  * audiopll  =  DEVICE_DT_GET (NODE_ACLK );
52- static  const  struct  nrf_clock_spec  aclk_spec  =  {
53- 	.frequency  =  ACLK_FREQUENCY ,
54- };
51+ #elif  DT_NODE_HAS_STATUS_OKAY (DT_NODELABEL (audio_auxpll ))
52+ #define  NODE_AUDIO_AUXPLL      DT_NODELABEL(audio_auxpll)
53+ #define  ACLK_NORDIC_FREQUENCY  DT_PROP(NODE_AUDIO_AUXPLL, nordic_frequency)
54+ BUILD_ASSERT ((ACLK_NORDIC_FREQUENCY  ==  NRF_AUXPLL_FREQ_DIV_AUDIO_48K ) || 
55+ 	     (ACLK_NORDIC_FREQUENCY  ==  NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ),
56+ 	     "Unsupported Audio AUXPLL frequency selection for TDM" );
57+ #define  ACLK_FREQUENCY  CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(NODE_AUDIO_AUXPLL)
5558#elif  DT_NODE_HAS_STATUS_OKAY (DT_NODELABEL (aclk ))
5659#define  NODE_ACLK       DT_NODELABEL(aclk)
5760#define  ACLK_FREQUENCY  DT_PROP_OR(NODE_ACLK, clock_frequency, 0)
@@ -107,7 +110,10 @@ struct tdm_drv_cfg {
107110};
108111
109112struct  tdm_drv_data  {
110- #if  CONFIG_CLOCK_CONTROL_NRF 
113+ #if  CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL  ||  DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
114+ 	const  struct  device  * audiopll ;
115+ 	struct  nrf_clock_spec  aclk_spec ;
116+ #elif  CONFIG_CLOCK_CONTROL_NRF 
111117	struct  onoff_manager  * clk_mgr ;
112118#endif 
113119	struct  onoff_client  clk_cli ;
@@ -132,8 +138,10 @@ static int audio_clock_request(struct tdm_drv_data *drv_data)
132138{
133139#if  DT_NODE_HAS_STATUS_OKAY (NODE_ACLK ) &&  CONFIG_CLOCK_CONTROL_NRF 
134140	return  onoff_request (drv_data -> clk_mgr , & drv_data -> clk_cli );
135- #elif  DT_NODE_HAS_STATUS_OKAY (NODE_ACLK ) &&  CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL 
136- 	return  nrf_clock_control_request (audiopll , & aclk_spec , & drv_data -> clk_cli );
141+ #elif  (DT_NODE_HAS_STATUS_OKAY (NODE_ACLK ) &&  CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL ) ||  \
142+ 	  DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
143+ 	return  nrf_clock_control_request (drv_data -> audiopll , & drv_data -> aclk_spec ,
144+ 					 & drv_data -> clk_cli );
137145#else 
138146	(void )drv_data ;
139147
@@ -145,10 +153,9 @@ static int audio_clock_release(struct tdm_drv_data *drv_data)
145153{
146154#if  DT_NODE_HAS_STATUS_OKAY (NODE_ACLK ) &&  CONFIG_CLOCK_CONTROL_NRF 
147155	return  onoff_release (drv_data -> clk_mgr );
148- #elif  DT_NODE_HAS_STATUS_OKAY (NODE_ACLK ) &&  CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL 
149- 	(void )drv_data ;
150- 
151- 	return  nrf_clock_control_release (audiopll , & aclk_spec );
156+ #elif  (DT_NODE_HAS_STATUS_OKAY (NODE_ACLK ) &&  CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL ) ||  \
157+ 	  DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
158+ 	return  nrf_clock_control_release (drv_data -> audiopll , & drv_data -> aclk_spec );
152159#else 
153160	(void )drv_data ;
154161
@@ -1120,6 +1127,16 @@ static void clock_manager_init(const struct device *dev)
11201127	subsys  =  CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO ;
11211128	drv_data -> clk_mgr  =  z_nrf_clock_control_get_onoff (subsys );
11221129	__ASSERT_NO_MSG (drv_data -> clk_mgr  !=  NULL );
1130+ #elif  DT_NODE_HAS_STATUS_OKAY (NODE_ACLK ) &&  CONFIG_CLOCK_CONTROL_NRFS_AUDIOPLL 
1131+ 	struct  tdm_drv_data  * drv_data  =  dev -> data ;
1132+ 
1133+ 	drv_data -> audiopll  =  DEVICE_DT_GET (NODE_ACLK );
1134+ 	drv_data -> aclk_spec .frequency  =  ACLK_FREQUENCY ;
1135+ #elif  DT_NODE_HAS_STATUS_OKAY (NODE_AUDIO_AUXPLL )
1136+ 	struct  tdm_drv_data  * drv_data  =  dev -> data ;
1137+ 
1138+ 	drv_data -> audiopll  =  DEVICE_DT_GET (NODE_AUDIO_AUXPLL );
1139+ 	drv_data -> aclk_spec .frequency  =  ACLK_FREQUENCY ;
11231140#else 
11241141	(void )dev ;
11251142#endif 
@@ -1194,9 +1211,10 @@ static DEVICE_API(i2s, tdm_nrf_drv_api) = {
11941211		clock_manager_init(dev);                                                           \
11951212		return 0;                                                                          \
11961213	}                                                                                          \
1197- 	BUILD_ASSERT((TDM_SCK_CLK_SRC(idx) != ACLK && TDM_MCK_CLK_SRC(idx) != ACLK) ||             \
1198- 			     DT_NODE_HAS_STATUS_OKAY(NODE_ACLK),                                   \
1199- 		     "Clock source ACLK requires the audiopll node.");                             \
1214+ 	BUILD_ASSERT((TDM_SCK_CLK_SRC(idx) != ACLK && TDM_MCK_CLK_SRC(idx) != ACLK) || \
1215+ 			     (DT_NODE_HAS_STATUS_OKAY(NODE_ACLK) || \
1216+ 			      DT_NODE_HAS_STATUS_OKAY(NODE_AUDIO_AUXPLL)), \
1217+ 		     "Clock source ACLK requires the audiopll/audio_auxpll node."); \
12001218	NRF_DT_CHECK_NODE_HAS_REQUIRED_MEMORY_REGIONS(TDM(idx));                                   \
12011219	DEVICE_DT_DEFINE(TDM(idx), tdm_nrf_init##idx, NULL, &tdm_nrf_data##idx, &tdm_nrf_cfg##idx, \
12021220			 POST_KERNEL, CONFIG_I2S_INIT_PRIORITY, &tdm_nrf_drv_api);
0 commit comments