13
13
LOG_MODULE_REGISTER (LOG_DOMAIN );
14
14
15
15
#include <zephyr/drivers/dai.h>
16
+ #include <adsp_clk.h>
16
17
#include "dmic.h"
17
18
#include "dmic_regs.h"
18
19
@@ -125,6 +126,68 @@ static int dai_nhlt_dmic_dai_params_get(struct dai_intel_dmic *dmic,
125
126
126
127
return 0 ;
127
128
}
129
+
130
+
131
+ /*
132
+ * @brief Set clock source used by device
133
+ *
134
+ * @param source Clock source index
135
+ */
136
+ static inline void dai_dmic_clock_select_set (const struct dai_intel_dmic * dmic , uint32_t source )
137
+ {
138
+ uint32_t val ;
139
+ #ifdef CONFIG_SOC_INTEL_ACE20_LNL /* Ace 2.0 */
140
+ val = sys_read32 (dmic -> vshim_base + DMICLVSCTL_OFFSET );
141
+ val &= ~DMICLVSCTL_MLCS ;
142
+ val |= FIELD_PREP (DMICLVSCTL_MLCS , source );
143
+ sys_write32 (val , dmic -> vshim_base + DMICLVSCTL_OFFSET );
144
+ #else
145
+ val = sys_read32 (dmic -> shim_base + DMICLCTL_OFFSET );
146
+ val &= ~DMICLCTL_MLCS ;
147
+ val |= FIELD_PREP (DMICLCTL_MLCS , source );
148
+ sys_write32 (val , dmic -> shim_base + DMICLCTL_OFFSET );
149
+ #endif
150
+ }
151
+
152
+ /*
153
+ * @brief Get clock source used by device
154
+ *
155
+ * @return Clock source index
156
+ */
157
+ static inline uint32_t dai_dmic_clock_select_get (const struct dai_intel_dmic * dmic )
158
+ {
159
+ uint32_t val ;
160
+ #ifdef CONFIG_SOC_INTEL_ACE20_LNL /* Ace 2.0 */
161
+ val = sys_read32 (dmic -> vshim_base + DMICLVSCTL_OFFSET );
162
+ return FIELD_GET (DMICLVSCTL_MLCS , val );
163
+ #else
164
+ val = sys_read32 (dmic -> shim_base + DMICLCTL_OFFSET );
165
+ return FIELD_GET (DMICLCTL_MLCS , val );
166
+ #endif
167
+ }
168
+
169
+ /*
170
+ * @brief Set clock source used by device
171
+ *
172
+ * @param source Clock source index
173
+ */
174
+ static int dai_dmic_set_clock (const struct dai_intel_dmic * dmic , const uint8_t clock_source )
175
+ {
176
+ LOG_DBG ("%s(): clock_source = %u" , __func__ , clock_source );
177
+
178
+ if (!adsp_clock_source_is_supported (clock_source )) {
179
+ return - ENOTSUP ;
180
+ }
181
+
182
+ #ifndef CONFIG_SOC_INTEL_ACE20_LNL /* Ace 2.0 */
183
+ if (clock_source && !(sys_read32 (dmic -> shim_base + DMICLCAP_OFFSET ) & DMICLCAP_MLCS )) {
184
+ return - ENOTSUP ;
185
+ }
186
+ #endif
187
+
188
+ dai_dmic_clock_select_set (dmic , clock_source );
189
+ return 0 ;
190
+ }
128
191
#else
129
192
static int dai_nhlt_dmic_dai_params_get (struct dai_intel_dmic * dmic ,
130
193
int32_t * outcontrol ,
@@ -204,6 +267,11 @@ static int dai_nhlt_dmic_dai_params_get(struct dai_intel_dmic *dmic,
204
267
205
268
return 0 ;
206
269
}
270
+
271
+ static inline int dai_dmic_set_clock (const struct dai_intel_dmic * dmic , const uint8_t clock_source )
272
+ {
273
+ return 0 ;
274
+ }
207
275
#endif
208
276
209
277
int dai_dmic_set_config_nhlt (struct dai_intel_dmic * dmic , const void * bespoke_cfg )
@@ -213,6 +281,8 @@ int dai_dmic_set_config_nhlt(struct dai_intel_dmic *dmic, const void *bespoke_cf
213
281
struct nhlt_pdm_ctrl_fir_cfg * fir_cfg_b [DMIC_HW_CONTROLLERS_MAX ];
214
282
struct nhlt_pdm_fir_coeffs * fir_a [DMIC_HW_CONTROLLERS_MAX ] = {NULL };
215
283
struct nhlt_pdm_fir_coeffs * fir_b [DMIC_HW_CONTROLLERS_MAX ];
284
+ struct nhlt_dmic_channel_ctrl_mask * dmic_cfg ;
285
+
216
286
uint32_t out_control [DMIC_HW_FIFOS_MAX ] = {0 };
217
287
uint32_t channel_ctrl_mask ;
218
288
uint32_t fir_control ;
@@ -253,11 +323,17 @@ int dai_dmic_set_config_nhlt(struct dai_intel_dmic *dmic, const void *bespoke_cf
253
323
p += sizeof (struct nhlt_dmic_clock_on_delay );
254
324
255
325
/* Channel_ctlr_mask bits indicate the FIFOs enabled*/
256
- channel_ctrl_mask = ((struct nhlt_dmic_channel_ctrl_mask * )p )-> channel_ctrl_mask ;
326
+ dmic_cfg = (struct nhlt_dmic_channel_ctrl_mask * )p ;
327
+ channel_ctrl_mask = dmic_cfg -> channel_ctrl_mask ;
257
328
num_fifos = POPCOUNT (channel_ctrl_mask ); /* Count set bits */
258
329
p += sizeof (struct nhlt_dmic_channel_ctrl_mask );
259
330
LOG_DBG ("dmic_set_config_nhlt(): channel_ctrl_mask = %d" , channel_ctrl_mask );
260
331
332
+ /* Configure clock source */
333
+ ret = dai_dmic_set_clock (dmic , dmic_cfg -> clock_source );
334
+ if (ret )
335
+ return ret ;
336
+
261
337
/* Get OUTCONTROLx configuration */
262
338
if (num_fifos < 1 || num_fifos > DMIC_HW_FIFOS_MAX ) {
263
339
LOG_ERR ("dmic_set_config_nhlt(): illegal number of FIFOs %d" , num_fifos );
@@ -623,13 +699,14 @@ int dai_dmic_set_config_nhlt(struct dai_intel_dmic *dmic, const void *bespoke_cf
623
699
return - EINVAL ;
624
700
}
625
701
626
- dmic -> dai_config_params .rate = CONFIG_DAI_DMIC_HW_IOCLK / rate_div ;
702
+ dmic -> dai_config_params .rate = adsp_clock_source_frequency (dmic_cfg -> clock_source ) /
703
+ rate_div ;
627
704
LOG_INF ("dmic_set_config_nhlt(): rate = %d, channels = %d, format = %d" ,
628
705
dmic -> dai_config_params .rate , dmic -> dai_config_params .channels ,
629
706
dmic -> dai_config_params .format );
630
707
631
708
LOG_INF ("dmic_set_config_nhlt(): io_clk %u, rate_div %d" ,
632
- CONFIG_DAI_DMIC_HW_IOCLK , rate_div );
709
+ adsp_clock_source_frequency ( dmic_cfg -> clock_source ) , rate_div );
633
710
634
711
LOG_INF ("dmic_set_config_nhlt(): enable0 %u, enable1 %u" ,
635
712
dmic -> enable [0 ], dmic -> enable [1 ]);
0 commit comments