ASoC: SOF: add quirk to override topology mclk_id
Some Intel-based platforms rely on a topology file that hard-codes the use of MCLK0. This is incorrect in 10% of the cases. Rather than generating yet another set of topology files, this patch adds a kernel module parameter to override the topology value. In hindsight, we should never have allowed mclks to be specified in topology, this is a hardware-level information that should not have been visible in the topology. Future patches will try to set this value automagically, e.g. by parsing the NHLT content. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Link: https://lore.kernel.org/r/20220919115350.43104-3-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
9ccbc2e12e
commit
d136949dd8
|
@ -376,6 +376,10 @@ static int dmic_num_override = -1;
|
|||
module_param_named(dmic_num, dmic_num_override, int, 0444);
|
||||
MODULE_PARM_DESC(dmic_num, "SOF HDA DMIC number");
|
||||
|
||||
static int mclk_id_override = -1;
|
||||
module_param_named(mclk_id, mclk_id_override, int, 0444);
|
||||
MODULE_PARM_DESC(mclk_id, "SOF SSP mclk_id");
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
static bool hda_codec_use_common_hdmi = IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI);
|
||||
module_param_named(use_common_hdmi, hda_codec_use_common_hdmi, bool, 0444);
|
||||
|
@ -1565,6 +1569,13 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
|
|||
|
||||
sof_pdata->tplg_filename = tplg_filename;
|
||||
}
|
||||
|
||||
/* check if mclk_id should be modified from topology defaults */
|
||||
if (mclk_id_override >= 0) {
|
||||
dev_info(sdev->dev, "Overriding topology with MCLK %d from kernel_parameter\n", mclk_id_override);
|
||||
sdev->mclk_id_override = true;
|
||||
sdev->mclk_id_quirk = mclk_id_override;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1249,6 +1249,7 @@ static int sof_link_afe_load(struct snd_soc_component *scomp, struct snd_sof_dai
|
|||
static int sof_link_ssp_load(struct snd_soc_component *scomp, struct snd_sof_dai_link *slink,
|
||||
struct sof_ipc_dai_config *config, struct snd_sof_dai *dai)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
|
||||
struct snd_soc_tplg_hw_config *hw_config = slink->hw_configs;
|
||||
struct sof_dai_private_data *private = dai->private;
|
||||
u32 size = sizeof(*config);
|
||||
|
@ -1273,6 +1274,12 @@ static int sof_link_ssp_load(struct snd_soc_component *scomp, struct snd_sof_dai
|
|||
|
||||
config[i].hdr.size = size;
|
||||
|
||||
if (sdev->mclk_id_override) {
|
||||
dev_dbg(scomp->dev, "tplg: overriding topology mclk_id %d by quirk %d\n",
|
||||
config[i].ssp.mclk_id, sdev->mclk_id_quirk);
|
||||
config[i].ssp.mclk_id = sdev->mclk_id_quirk;
|
||||
}
|
||||
|
||||
/* copy differentiating hw configs to ipc structs */
|
||||
config[i].ssp.mclk_rate = le32_to_cpu(hw_config[i].mclk_rate);
|
||||
config[i].ssp.bclk_rate = le32_to_cpu(hw_config[i].bclk_rate);
|
||||
|
|
|
@ -601,6 +601,10 @@ struct snd_sof_dev {
|
|||
/* to protect the ipc_rx_handler_list and dsp_state_handler_list list */
|
||||
struct mutex client_event_handler_mutex;
|
||||
|
||||
/* quirks to override topology values */
|
||||
bool mclk_id_override;
|
||||
u16 mclk_id_quirk; /* same size as in IPC3 definitions */
|
||||
|
||||
void *private; /* core does not touch this */
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue