Lines Matching defs:dmic
19 #include "dmic-process.h"
20 #include "dmic-internal.h"
22 #include "dmic-debug.h"
124 static void find_modes(struct intel_dmic_params *dmic, struct dmic_calc_decim_modes *modes,
127 int di = dmic->dmic_dai_index;
160 if (dmic->dmic_prm[di].pdmclk_max < DMIC_HW_PDM_CLK_MIN ||
161 dmic->dmic_prm[di].pdmclk_max > dmic->dmic_prm[di].io_clk / 2) {
165 if (dmic->dmic_prm[di].pdmclk_min < DMIC_HW_PDM_CLK_MIN ||
166 dmic->dmic_prm[di].pdmclk_min > dmic->dmic_prm[di].pdmclk_max) {
172 if (dmic->dmic_prm[di].duty_min > dmic->dmic_prm[di].duty_max) {
176 if (dmic->dmic_prm[di].duty_min < DMIC_HW_DUTY_MIN ||
177 dmic->dmic_prm[di].duty_min > DMIC_HW_DUTY_MAX) {
181 if (dmic->dmic_prm[di].duty_max < DMIC_HW_DUTY_MIN ||
182 dmic->dmic_prm[di].duty_max > DMIC_HW_DUTY_MAX) {
188 clkdiv_min = ceil_divide(dmic->dmic_prm[di].io_clk, dmic->dmic_prm[di].pdmclk_max);
190 clkdiv_max = dmic->dmic_prm[di].io_clk / dmic->dmic_prm[di].pdmclk_min;
205 pdmclk = dmic->dmic_prm[di].io_clk / clkdiv;
211 if (osr < osr_min || du_min < dmic->dmic_prm[di].duty_min ||
212 du_max > dmic->dmic_prm[di].duty_max)
230 if (ioclk_test == dmic->dmic_prm[di].io_clk &&
312 static struct pdm_decim *get_fir(struct intel_dmic_params *dmic,
320 int di = dmic->dmic_dai_index;
325 cic_fs = dmic->dmic_prm[di].io_clk / cfg->clkdiv / cfg->mcic;
331 (int)dmic->dmic_prm[di].io_clk / fs / 2 -
409 static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configuration *cfg,
469 cfg->fir_a = get_fir(dmic, cfg, cfg->mfir_a);
478 cfg->fir_b = get_fir(dmic, cfg, cfg->mfir_b);
549 static void ipm_helper1(struct intel_dmic_params *dmic, int *ipm)
551 int di = dmic->dmic_dai_index;
559 if (dmic->dmic_prm[di].pdm[i].enable_mic_a ||
560 dmic->dmic_prm[di].pdm[i].enable_mic_b)
576 static void ipm_helper2(struct intel_dmic_params *dmic, int source[], int *ipm)
578 int di = dmic->dmic_dai_index;
591 if (dmic->dmic_prm[di].pdm[i].enable_mic_a ||
592 dmic->dmic_prm[di].pdm[i].enable_mic_b) {
611 static int stereo_helper(struct intel_dmic_params *dmic, int stereo[], int swap[])
620 if (dmic->dmic_prm[0].pdm[i].enable_mic_a ||
621 dmic->dmic_prm[1].pdm[i].enable_mic_a)
624 if (dmic->dmic_prm[0].pdm[i].enable_mic_b ||
625 dmic->dmic_prm[1].pdm[i].enable_mic_b)
633 swap[i] = (dmic->dmic_prm[0].pdm[i].enable_mic_b ||
634 dmic->dmic_prm[1].pdm[i].enable_mic_b) && !cnt;
637 swap_check = (dmic->dmic_prm[1].pdm[i].enable_mic_a ||
638 dmic->dmic_prm[0].pdm[i].enable_mic_a);
648 static int configure_registers(struct intel_dmic_params *dmic, struct dmic_calc_configuration *cfg)
670 int di = dmic->dmic_dai_index;
684 * ts_group array index corresponds to dmic hw fifos, that gather audio samples from pdm
732 if (dmic->dmic_prm[di].pdm[i].enable_mic_a) {
733 dmic->dmic_blob.ts_group[di] &= ~(0xF << (chmap_bits * mic));
734 dmic->dmic_blob.ts_group[di] |= 0x0 << (chmap_bits * mic);
737 if (dmic->dmic_prm[di].pdm[i].enable_mic_b) {
738 dmic->dmic_blob.ts_group[di] &= ~(0xF << (chmap_bits * mic));
739 dmic->dmic_blob.ts_group[di] |= 0x1 << (chmap_bits * mic);
745 for (i = 0; i < dmic->dmic_prm[di].num_pdm_active; i++)
746 dmic->dmic_blob.channel_pdm_mask |= 1 << i;
749 dmic->dmic_blob.channel_ctrl_mask = 0x3;
757 of0 = (dmic->dmic_prm[0].fifo_bits == 32) ? 2 : 0;
758 of1 = (dmic->dmic_prm[1].fifo_bits == 32) ? 2 : 0;
760 if (dmic->dmic_prm[di].driver_version == 1) {
762 ipm_helper1(dmic, &ipm);
772 ipm_helper1(dmic, &ipm);
784 if (dmic->dmic_prm[di].driver_version == 2 || dmic->dmic_prm[di].driver_version == 3) {
786 ipm_helper2(dmic, source, &ipm);
801 ipm_helper2(dmic, source, &ipm);
818 dmic->dmic_blob.chan_ctrl_cfg[di] = val;
820 ret = stereo_helper(dmic, stereo, swap);
831 CIC_CONTROL_MIC_B_POLARITY(dmic->dmic_prm[di].pdm[i].polarity_mic_b) |
832 CIC_CONTROL_MIC_A_POLARITY(dmic->dmic_prm[di].pdm[i].polarity_mic_a) |
835 if (dmic->dmic_prm[di].driver_version == 1)
838 dmic->dmic_blob_pdm[i].cic_control = val;
842 dmic->dmic_blob_pdm[i].cic_config = val;
848 edge = dmic->dmic_prm[di].pdm[i].clk_edge;
853 MIC_CONTROL_PDM_SKEW(dmic->dmic_prm[di].pdm[i].skew) |
857 dmic->dmic_blob_pdm[i].mic_control = val;
873 dmic->dmic_blob_fir[i][0].fir_control = val;
878 dmic->dmic_blob_fir[i][0].fir_config = val;
881 dmic->dmic_blob_fir[i][0].dc_offset_left = val;
884 dmic->dmic_blob_fir[i][0].dc_offset_right = val;
887 dmic->dmic_blob_fir[i][0].out_gain_left = val;
890 dmic->dmic_blob_fir[i][0].out_gain_right = val;
900 dmic->dmic_fir_array.fir_coeffs[i][0][j] = cu;
902 dmic->dmic_fir_array.fir_len[0] = length;
904 dmic->dmic_fir_array.fir_len[0] = 0;
916 dmic->dmic_blob_fir[i][1].fir_control = val;
921 dmic->dmic_blob_fir[i][1].fir_config = val;
923 dmic->dmic_blob_fir[i][1].dc_offset_left = val;
926 dmic->dmic_blob_fir[i][1].dc_offset_right = val;
929 dmic->dmic_blob_fir[i][1].out_gain_left = val;
932 dmic->dmic_blob_fir[i][1].out_gain_right = val;
942 dmic->dmic_fir_array.fir_coeffs[i][1][j] = cu;
944 dmic->dmic_fir_array.fir_len[1] = length;
946 dmic->dmic_fir_array.fir_len[1] = 0;
964 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
972 if (!dmic)
975 di = dmic->dmic_dai_index;
983 if (dmic->dmic_prm[di].num_pdm_active > DMIC_HW_CONTROLLERS) {
990 switch (dmic->dmic_prm[di].fifo_bits) {
1006 find_modes(dmic, &modes_a, dmic->dmic_prm[0].fifo_fs);
1007 if (modes_a.num_of_modes == 0 && dmic->dmic_prm[0].fifo_fs > 0) {
1013 find_modes(dmic, &modes_b, dmic->dmic_prm[1].fifo_fs);
1014 if (modes_b.num_of_modes == 0 && dmic->dmic_prm[1].fifo_fs > 0) {
1021 ret = select_mode(dmic, &cfg, &modes_ab);
1031 ret = configure_registers(dmic, &cfg);
1038 dmic_print_internal(dmic);
1040 dmic->dmic_count++;
1050 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1053 if (!dmic)
1058 if (dmic->dmic_prm[index].pdm[0].enable_mic_a)
1061 if (dmic->dmic_prm[index].pdm[0].enable_mic_b)
1064 if (dmic->dmic_prm[index].pdm[1].enable_mic_a)
1067 if (dmic->dmic_prm[index].pdm[1].enable_mic_b)
1070 *sample_rate = dmic->dmic_prm[index].fifo_fs;
1072 *bits_per_sample = dmic->dmic_prm[index].fifo_bits;
1073 *num_mics = dmic->dmic_mic_config.num_mics;
1074 *extension = dmic->dmic_mic_config.extension;
1075 *array_type = dmic->dmic_mic_config.array_type;
1076 *snr = dmic->dmic_mic_config.snr;
1077 *sensitivity = dmic->dmic_mic_config.sensitivity;
1090 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1092 if (!dmic)
1095 *type = dmic->dmic_mic_config.vendor[index].type;
1096 *panel = dmic->dmic_mic_config.vendor[index].panel;
1097 *speaker_position_distance = dmic->dmic_mic_config.vendor[index].speaker_position_distance;
1098 *horizontal_offset = dmic->dmic_mic_config.vendor[index].horizontal_offset;
1099 *vertical_offset = dmic->dmic_mic_config.vendor[index].vertical_offset;
1100 *frequency_low_band = dmic->dmic_mic_config.vendor[index].frequency_low_band;
1101 *frequency_high_band = dmic->dmic_mic_config.vendor[index].frequency_high_band;
1102 *direction_angle = dmic->dmic_mic_config.vendor[index].direction_angle;
1103 *elevation_angle = dmic->dmic_mic_config.vendor[index].elevation_angle;
1104 *vertical_angle_begin = dmic->dmic_mic_config.vendor[index].vertical_angle_begin;
1105 *vertical_angle_end = dmic->dmic_mic_config.vendor[index].vertical_angle_end;
1106 *horizontal_angle_begin = dmic->dmic_mic_config.vendor[index].horizontal_angle_begin;
1107 *horizontal_angle_end = dmic->dmic_mic_config.vendor[index].horizontal_angle_end;
1114 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1117 if (!dmic || !dmic->dmic_count)
1125 if (dmic->dmic_fir_array.fir_len[0] == 0) {
1129 if (dmic->dmic_fir_array.fir_len[1] == 0) {
1137 if ((dmic->dmic_blob.channel_pdm_mask & BIT(i)) == 0)
1143 *size += dmic->dmic_fir_array.fir_len[fir_index_0] * sizeof(uint32_t);
1144 *size += dmic->dmic_fir_array.fir_len[fir_index_1] * sizeof(uint32_t);
1152 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1154 if (!dmic || !dmic->dmic_count)
1157 return dmic->dmic_count;
1162 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1167 if (!dmic || !dmic->dmic_count)
1171 memcpy(vendor_blob, &dmic->dmic_blob, sizeof(struct dmic_intel_config_data));
1177 if (dmic->dmic_fir_array.fir_len[0] == 0) {
1181 if (dmic->dmic_fir_array.fir_len[1] == 0) {
1189 if ((dmic->dmic_blob.channel_pdm_mask & BIT(i)) == 0)
1193 memcpy(vendor_blob, (uint8_t *)&dmic->dmic_blob_pdm[i],
1198 memcpy(vendor_blob, (uint8_t *)&dmic->dmic_blob_fir[i][fir_index_0],
1203 memcpy(vendor_blob, (uint8_t *)&dmic->dmic_blob_fir[i][fir_index_1],
1208 memcpy(vendor_blob, (uint8_t *)&dmic->dmic_fir_array.fir_coeffs[i][fir_index_0][0],
1209 dmic->dmic_fir_array.fir_len[fir_index_0] * sizeof(uint32_t));
1210 vendor_blob += dmic->dmic_fir_array.fir_len[fir_index_0] * sizeof(uint32_t);
1213 memcpy(vendor_blob, (uint8_t *)&dmic->dmic_fir_array.fir_coeffs[i][fir_index_1][0],
1214 dmic->dmic_fir_array.fir_len[fir_index_1] * sizeof(uint32_t));
1215 vendor_blob += dmic->dmic_fir_array.fir_len[fir_index_1] * sizeof(uint32_t);
1229 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1231 if (!dmic)
1239 dmic->dmic_dai_index = dai_index;
1240 dmic->dmic_prm[dai_index].driver_version = driver_version;
1241 dmic->dmic_prm[dai_index].io_clk = io_clk;
1242 dmic->dmic_prm[dai_index].num_pdm_active = num_pdm_active;
1243 dmic->dmic_prm[dai_index].fifo_bits = fifo_word_length;
1244 dmic->dmic_prm[dai_index].pdmclk_min = clk_min;
1245 dmic->dmic_prm[dai_index].pdmclk_max = clk_max;
1246 dmic->dmic_prm[dai_index].duty_min = duty_min;
1247 dmic->dmic_prm[dai_index].duty_max = duty_max;
1248 dmic->dmic_prm[dai_index].fifo_fs = sample_rate;
1249 dmic->dmic_prm[dai_index].unmute_ramp_time = unmute_ramp_time;
1257 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1260 if (!dmic)
1268 di = dmic->dmic_dai_index;
1270 dmic->dmic_prm[di].pdm[pdm_index].enable_mic_a = enable_a;
1271 dmic->dmic_prm[di].pdm[pdm_index].enable_mic_b = enable_b;
1272 dmic->dmic_prm[di].pdm[pdm_index].polarity_mic_a = polarity_a;
1273 dmic->dmic_prm[di].pdm[pdm_index].polarity_mic_b = polarity_b;
1274 dmic->dmic_prm[di].pdm[pdm_index].clk_edge = clk_edge;
1275 dmic->dmic_prm[di].pdm[pdm_index].skew = skew;
1282 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1284 if (!dmic)
1287 dmic->dmic_mic_config.extension = 1;
1288 dmic->dmic_mic_config.snr = snr;
1289 dmic->dmic_mic_config.sensitivity = sensitivity;
1302 struct intel_dmic_params *dmic = (struct intel_dmic_params *)nhlt->dmic_params;
1304 if (!dmic)
1307 dmic->dmic_mic_config.vendor[index].type = type;
1308 dmic->dmic_mic_config.vendor[index].panel = panel;
1309 dmic->dmic_mic_config.vendor[index].speaker_position_distance = speaker_position_distance;
1310 dmic->dmic_mic_config.vendor[index].horizontal_offset = horizontal_offset;
1311 dmic->dmic_mic_config.vendor[index].vertical_offset = vertical_offset;
1312 dmic->dmic_mic_config.vendor[index].frequency_low_band = frequency_low_band;
1313 dmic->dmic_mic_config.vendor[index].frequency_high_band = frequency_high_band;
1314 dmic->dmic_mic_config.vendor[index].direction_angle = direction_angle;
1315 dmic->dmic_mic_config.vendor[index].elevation_angle = elevation_angle;
1316 dmic->dmic_mic_config.vendor[index].vertical_angle_begin = vertical_angle_begin;
1317 dmic->dmic_mic_config.vendor[index].vertical_angle_end = vertical_angle_end;
1318 dmic->dmic_mic_config.vendor[index].horizontal_angle_begin = horizontal_angle_begin;
1319 dmic->dmic_mic_config.vendor[index].horizontal_angle_end = horizontal_angle_end;
1321 dmic->dmic_mic_config.num_mics++;
1326 /* init dmic parameters, should be called before parsing dais */
1329 struct intel_dmic_params *dmic;
1332 dmic = calloc(1, sizeof(struct intel_dmic_params));
1333 if (!dmic)
1336 nhlt->dmic_params = dmic;
1338 dmic->dmic_blob.gateway_attributes = 1;
1340 dmic->dmic_blob.clock_on_delay = 16;
1343 dmic->dmic_blob.ts_group[i] = 0xFFFFFFFF; /* not enabled */
1345 dmic->dmic_count = 0;
1347 dmic->dmic_mic_config.num_mics = 0;
1348 dmic->dmic_mic_config.extension = 0;
1349 dmic->dmic_mic_config.array_type = 0;
1350 dmic->dmic_mic_config.snr = 0;
1351 dmic->dmic_mic_config.sensitivity = 0;