Loading sound/soc/sof/intel/atom.c +8 −8 Original line number Diff line number Diff line Loading @@ -274,22 +274,22 @@ static const char *fixup_tplg_name(struct snd_sof_dev *sdev, const char *ssp_str) { const char *tplg_filename = NULL; char *filename; char *split_ext; const char *split_ext; char *filename, *tmp; filename = devm_kstrdup(sdev->dev, sof_tplg_filename, GFP_KERNEL); filename = kstrdup(sof_tplg_filename, GFP_KERNEL); if (!filename) return NULL; /* this assumes a .tplg extension */ split_ext = strsep(&filename, "."); if (split_ext) { tmp = filename; split_ext = strsep(&tmp, "."); if (split_ext) tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, "%s-%s.tplg", split_ext, ssp_str); if (!tplg_filename) return NULL; } kfree(filename); return tplg_filename; } Loading sound/soc/sof/intel/hda-probes.c +8 −8 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ hda_compr_get_stream(struct snd_compr_stream *cstream) return cstream->runtime->private_data; } static int hda_probes_compr_assign(struct sof_client_dev *cdev, static int hda_probes_compr_startup(struct sof_client_dev *cdev, struct snd_compr_stream *cstream, struct snd_soc_dai *dai, u32 *stream_id) { Loading @@ -45,7 +45,7 @@ static int hda_probes_compr_assign(struct sof_client_dev *cdev, return 0; } static int hda_probes_compr_free(struct sof_client_dev *cdev, static int hda_probes_compr_shutdown(struct sof_client_dev *cdev, struct snd_compr_stream *cstream, struct snd_soc_dai *dai) { Loading Loading @@ -127,8 +127,8 @@ static int hda_probes_compr_pointer(struct sof_client_dev *cdev, /* SOF client implementation */ static const struct sof_probes_host_ops hda_probes_ops = { .assign = hda_probes_compr_assign, .free = hda_probes_compr_free, .startup = hda_probes_compr_startup, .shutdown = hda_probes_compr_shutdown, .set_params = hda_probes_compr_set_params, .trigger = hda_probes_compr_trigger, .pointer = hda_probes_compr_pointer, Loading sound/soc/sof/intel/hda-stream.c +10 −5 Original line number Diff line number Diff line Loading @@ -411,6 +411,11 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st return -ENODEV; } if (!dmab) { dev_err(sdev->dev, "error: no dma buffer allocated!\n"); return -ENODEV; } if (hstream->posbuf) *hstream->posbuf = 0; Loading Loading @@ -485,16 +490,16 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev, return -ENODEV; } /* decouple host and link DMA */ mask = 0x1 << hstream->index; snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL, mask, mask); if (!dmab) { dev_err(sdev->dev, "error: no dma buffer allocated!\n"); return -ENODEV; } /* decouple host and link DMA */ mask = 0x1 << hstream->index; snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL, mask, mask); /* clear stream status */ snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset, SOF_HDA_CL_DMA_SD_INT_MASK | Loading sound/soc/sof/intel/hda.c +48 −23 Original line number Diff line number Diff line Loading @@ -776,13 +776,12 @@ static const char *fixup_tplg_name(struct snd_sof_dev *sdev, return tplg_filename; } static int dmic_topology_fixup(struct snd_sof_dev *sdev, static int dmic_detect_topology_fixup(struct snd_sof_dev *sdev, const char **tplg_filename, const char *idisp_str, int *dmic_found) int *dmic_found, bool tplg_fixup) { const char *default_tplg_filename = *tplg_filename; const char *fixed_tplg_filename; const char *dmic_str; int dmic_num; Loading @@ -808,14 +807,19 @@ static int dmic_topology_fixup(struct snd_sof_dev *sdev, break; } if (tplg_fixup) { const char *default_tplg_filename = *tplg_filename; const char *fixed_tplg_filename; fixed_tplg_filename = fixup_tplg_name(sdev, default_tplg_filename, idisp_str, dmic_str); if (!fixed_tplg_filename) return -ENOMEM; *tplg_filename = fixed_tplg_filename; } dev_info(sdev->dev, "DMICs detected in NHLT tables: %d\n", dmic_num); *dmic_found = dmic_num; *tplg_filename = fixed_tplg_filename; return 0; } Loading Loading @@ -1221,6 +1225,8 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev, * - one external HDAudio codec */ if (!*mach && codec_num <= 2) { bool tplg_fixup; hda_mach = snd_soc_acpi_intel_hda_machines; dev_info(bus->dev, "using HDA machine driver %s now\n", Loading @@ -1232,8 +1238,15 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev, idisp_str = ""; /* topology: use the info from hda_machines */ if (pdata->tplg_filename) { tplg_fixup = false; tplg_filename = pdata->tplg_filename; } else { tplg_fixup = true; tplg_filename = hda_mach->sof_tplg_filename; ret = dmic_topology_fixup(sdev, &tplg_filename, idisp_str, &dmic_num); } ret = dmic_detect_topology_fixup(sdev, &tplg_filename, idisp_str, &dmic_num, tplg_fixup); if (ret < 0) return; Loading Loading @@ -1397,12 +1410,19 @@ static struct snd_soc_acpi_mach *hda_sdw_machine_select(struct snd_sof_dev *sdev } if (mach && mach->link_mask) { int dmic_num = 0; bool tplg_fixup; const char *tplg_filename; mach->mach_params.links = mach->links; mach->mach_params.link_mask = mach->link_mask; mach->mach_params.platform = dev_name(sdev->dev); pdata->fw_filename = pdata->desc->default_fw_filename[pdata->ipc_type]; pdata->tplg_filename = mach->sof_tplg_filename; if (pdata->tplg_filename) { tplg_fixup = false; } else { tplg_fixup = true; tplg_filename = mach->sof_tplg_filename; } /* * DMICs use up to 4 pins and are typically pin-muxed with SoundWire Loading @@ -1412,15 +1432,15 @@ static struct snd_soc_acpi_mach *hda_sdw_machine_select(struct snd_sof_dev *sdev * b) the NHLT table reports the presence of microphones */ if (hweight_long(mach->link_mask) <= 2) { const char *tplg_filename = mach->sof_tplg_filename; int ret; ret = dmic_topology_fixup(sdev, &tplg_filename, "", &dmic_num); ret = dmic_detect_topology_fixup(sdev, &tplg_filename, "", &dmic_num, tplg_fixup); if (ret < 0) return NULL; pdata->tplg_filename = tplg_filename; } if (tplg_fixup) pdata->tplg_filename = tplg_filename; mach->mach_params.dmic_num = dmic_num; dev_dbg(sdev->dev, Loading Loading @@ -1466,18 +1486,22 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev) mach = snd_soc_acpi_find_machine(desc->machines); if (mach) { bool add_extension = false; bool tplg_fixup = false; /* * If tplg file name is overridden, use it instead of * the one set in mach table */ if (!sof_pdata->tplg_filename) if (!sof_pdata->tplg_filename) { sof_pdata->tplg_filename = mach->sof_tplg_filename; tplg_fixup = true; } /* report to machine driver if any DMICs are found */ mach->mach_params.dmic_num = check_dmic_num(sdev); if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER && if (tplg_fixup && mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER && mach->mach_params.dmic_num) { tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, "%s%s%d%s", Loading @@ -1500,7 +1524,8 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev) /* report SSP link mask to machine driver */ mach->mach_params.i2s_link_mask = check_nhlt_ssp_mask(sdev); if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER && if (tplg_fixup && mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER && mach->mach_params.i2s_link_mask) { int ssp_num; Loading @@ -1523,7 +1548,7 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev) add_extension = true; } if (add_extension) { if (tplg_fixup && add_extension) { tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, "%s%s", sof_pdata->tplg_filename, Loading sound/soc/sof/intel/mtl.c +1 −12 Original line number Diff line number Diff line Loading @@ -372,20 +372,9 @@ static int mtl_dsp_core_power_up(struct snd_sof_dev *sdev, int core) ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE, dspcxctl, (dspcxctl & cpa) == cpa, HDA_DSP_REG_POLL_INTERVAL_US, HDA_DSP_RESET_TIMEOUT_US); if (ret < 0) { if (ret < 0) dev_err(sdev->dev, "%s: timeout on MTL_DSP2CXCTL_PRIMARY_CORE read\n", __func__); return ret; } /* did core power up ? */ dspcxctl = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE); if ((dspcxctl & MTL_DSP2CXCTL_PRIMARY_CORE_CPA_MASK) != MTL_DSP2CXCTL_PRIMARY_CORE_CPA_MASK) { dev_err(sdev->dev, "power up core failed core %d adspcs %#x\n", core, dspcxctl); ret = -EIO; } return ret; } Loading Loading
sound/soc/sof/intel/atom.c +8 −8 Original line number Diff line number Diff line Loading @@ -274,22 +274,22 @@ static const char *fixup_tplg_name(struct snd_sof_dev *sdev, const char *ssp_str) { const char *tplg_filename = NULL; char *filename; char *split_ext; const char *split_ext; char *filename, *tmp; filename = devm_kstrdup(sdev->dev, sof_tplg_filename, GFP_KERNEL); filename = kstrdup(sof_tplg_filename, GFP_KERNEL); if (!filename) return NULL; /* this assumes a .tplg extension */ split_ext = strsep(&filename, "."); if (split_ext) { tmp = filename; split_ext = strsep(&tmp, "."); if (split_ext) tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, "%s-%s.tplg", split_ext, ssp_str); if (!tplg_filename) return NULL; } kfree(filename); return tplg_filename; } Loading
sound/soc/sof/intel/hda-probes.c +8 −8 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ hda_compr_get_stream(struct snd_compr_stream *cstream) return cstream->runtime->private_data; } static int hda_probes_compr_assign(struct sof_client_dev *cdev, static int hda_probes_compr_startup(struct sof_client_dev *cdev, struct snd_compr_stream *cstream, struct snd_soc_dai *dai, u32 *stream_id) { Loading @@ -45,7 +45,7 @@ static int hda_probes_compr_assign(struct sof_client_dev *cdev, return 0; } static int hda_probes_compr_free(struct sof_client_dev *cdev, static int hda_probes_compr_shutdown(struct sof_client_dev *cdev, struct snd_compr_stream *cstream, struct snd_soc_dai *dai) { Loading Loading @@ -127,8 +127,8 @@ static int hda_probes_compr_pointer(struct sof_client_dev *cdev, /* SOF client implementation */ static const struct sof_probes_host_ops hda_probes_ops = { .assign = hda_probes_compr_assign, .free = hda_probes_compr_free, .startup = hda_probes_compr_startup, .shutdown = hda_probes_compr_shutdown, .set_params = hda_probes_compr_set_params, .trigger = hda_probes_compr_trigger, .pointer = hda_probes_compr_pointer, Loading
sound/soc/sof/intel/hda-stream.c +10 −5 Original line number Diff line number Diff line Loading @@ -411,6 +411,11 @@ int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_st return -ENODEV; } if (!dmab) { dev_err(sdev->dev, "error: no dma buffer allocated!\n"); return -ENODEV; } if (hstream->posbuf) *hstream->posbuf = 0; Loading Loading @@ -485,16 +490,16 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev, return -ENODEV; } /* decouple host and link DMA */ mask = 0x1 << hstream->index; snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL, mask, mask); if (!dmab) { dev_err(sdev->dev, "error: no dma buffer allocated!\n"); return -ENODEV; } /* decouple host and link DMA */ mask = 0x1 << hstream->index; snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL, mask, mask); /* clear stream status */ snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset, SOF_HDA_CL_DMA_SD_INT_MASK | Loading
sound/soc/sof/intel/hda.c +48 −23 Original line number Diff line number Diff line Loading @@ -776,13 +776,12 @@ static const char *fixup_tplg_name(struct snd_sof_dev *sdev, return tplg_filename; } static int dmic_topology_fixup(struct snd_sof_dev *sdev, static int dmic_detect_topology_fixup(struct snd_sof_dev *sdev, const char **tplg_filename, const char *idisp_str, int *dmic_found) int *dmic_found, bool tplg_fixup) { const char *default_tplg_filename = *tplg_filename; const char *fixed_tplg_filename; const char *dmic_str; int dmic_num; Loading @@ -808,14 +807,19 @@ static int dmic_topology_fixup(struct snd_sof_dev *sdev, break; } if (tplg_fixup) { const char *default_tplg_filename = *tplg_filename; const char *fixed_tplg_filename; fixed_tplg_filename = fixup_tplg_name(sdev, default_tplg_filename, idisp_str, dmic_str); if (!fixed_tplg_filename) return -ENOMEM; *tplg_filename = fixed_tplg_filename; } dev_info(sdev->dev, "DMICs detected in NHLT tables: %d\n", dmic_num); *dmic_found = dmic_num; *tplg_filename = fixed_tplg_filename; return 0; } Loading Loading @@ -1221,6 +1225,8 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev, * - one external HDAudio codec */ if (!*mach && codec_num <= 2) { bool tplg_fixup; hda_mach = snd_soc_acpi_intel_hda_machines; dev_info(bus->dev, "using HDA machine driver %s now\n", Loading @@ -1232,8 +1238,15 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev, idisp_str = ""; /* topology: use the info from hda_machines */ if (pdata->tplg_filename) { tplg_fixup = false; tplg_filename = pdata->tplg_filename; } else { tplg_fixup = true; tplg_filename = hda_mach->sof_tplg_filename; ret = dmic_topology_fixup(sdev, &tplg_filename, idisp_str, &dmic_num); } ret = dmic_detect_topology_fixup(sdev, &tplg_filename, idisp_str, &dmic_num, tplg_fixup); if (ret < 0) return; Loading Loading @@ -1397,12 +1410,19 @@ static struct snd_soc_acpi_mach *hda_sdw_machine_select(struct snd_sof_dev *sdev } if (mach && mach->link_mask) { int dmic_num = 0; bool tplg_fixup; const char *tplg_filename; mach->mach_params.links = mach->links; mach->mach_params.link_mask = mach->link_mask; mach->mach_params.platform = dev_name(sdev->dev); pdata->fw_filename = pdata->desc->default_fw_filename[pdata->ipc_type]; pdata->tplg_filename = mach->sof_tplg_filename; if (pdata->tplg_filename) { tplg_fixup = false; } else { tplg_fixup = true; tplg_filename = mach->sof_tplg_filename; } /* * DMICs use up to 4 pins and are typically pin-muxed with SoundWire Loading @@ -1412,15 +1432,15 @@ static struct snd_soc_acpi_mach *hda_sdw_machine_select(struct snd_sof_dev *sdev * b) the NHLT table reports the presence of microphones */ if (hweight_long(mach->link_mask) <= 2) { const char *tplg_filename = mach->sof_tplg_filename; int ret; ret = dmic_topology_fixup(sdev, &tplg_filename, "", &dmic_num); ret = dmic_detect_topology_fixup(sdev, &tplg_filename, "", &dmic_num, tplg_fixup); if (ret < 0) return NULL; pdata->tplg_filename = tplg_filename; } if (tplg_fixup) pdata->tplg_filename = tplg_filename; mach->mach_params.dmic_num = dmic_num; dev_dbg(sdev->dev, Loading Loading @@ -1466,18 +1486,22 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev) mach = snd_soc_acpi_find_machine(desc->machines); if (mach) { bool add_extension = false; bool tplg_fixup = false; /* * If tplg file name is overridden, use it instead of * the one set in mach table */ if (!sof_pdata->tplg_filename) if (!sof_pdata->tplg_filename) { sof_pdata->tplg_filename = mach->sof_tplg_filename; tplg_fixup = true; } /* report to machine driver if any DMICs are found */ mach->mach_params.dmic_num = check_dmic_num(sdev); if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER && if (tplg_fixup && mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER && mach->mach_params.dmic_num) { tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, "%s%s%d%s", Loading @@ -1500,7 +1524,8 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev) /* report SSP link mask to machine driver */ mach->mach_params.i2s_link_mask = check_nhlt_ssp_mask(sdev); if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER && if (tplg_fixup && mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER && mach->mach_params.i2s_link_mask) { int ssp_num; Loading @@ -1523,7 +1548,7 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev) add_extension = true; } if (add_extension) { if (tplg_fixup && add_extension) { tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, "%s%s", sof_pdata->tplg_filename, Loading
sound/soc/sof/intel/mtl.c +1 −12 Original line number Diff line number Diff line Loading @@ -372,20 +372,9 @@ static int mtl_dsp_core_power_up(struct snd_sof_dev *sdev, int core) ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE, dspcxctl, (dspcxctl & cpa) == cpa, HDA_DSP_REG_POLL_INTERVAL_US, HDA_DSP_RESET_TIMEOUT_US); if (ret < 0) { if (ret < 0) dev_err(sdev->dev, "%s: timeout on MTL_DSP2CXCTL_PRIMARY_CORE read\n", __func__); return ret; } /* did core power up ? */ dspcxctl = snd_sof_dsp_read(sdev, HDA_DSP_BAR, MTL_DSP2CXCTL_PRIMARY_CORE); if ((dspcxctl & MTL_DSP2CXCTL_PRIMARY_CORE_CPA_MASK) != MTL_DSP2CXCTL_PRIMARY_CORE_CPA_MASK) { dev_err(sdev->dev, "power up core failed core %d adspcs %#x\n", core, dspcxctl); ret = -EIO; } return ret; } Loading