Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: hdac_hda: fix HDA patch loader support

The array size is irrelevant with SNDRV_CARDS. dev_index is from
codec address and the available codec number is HDA_MAX_CODECS.
Also, hda_pvt->fw is for a temporary use, no need to add a new extra
field in hdac_hda_priv{}.

Fixes: 842a62a75e70 ("ASoC: hdac_hda: add HDA patch loader support")
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20230921064317.2120452-1-yung-chuan.liao@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Bard Liao and committed by
Mark Brown
2f3fb85b 667f45ca

+8 -10
+8 -7
sound/soc/codecs/hdac_hda.c
··· 37 37 SNDRV_PCM_RATE_192000) 38 38 39 39 #ifdef CONFIG_SND_HDA_PATCH_LOADER 40 - static char *loadable_patch[SNDRV_CARDS]; 40 + static char *loadable_patch[HDA_MAX_CODECS]; 41 41 42 42 module_param_array_named(patch, loadable_patch, charp, NULL, 0444); 43 - MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface."); 43 + MODULE_PARM_DESC(patch, "Patch file array for Intel HD audio interface. The array index is the codec address."); 44 44 #endif 45 45 46 46 static int hdac_hda_dai_open(struct snd_pcm_substream *substream, ··· 434 434 435 435 #ifdef CONFIG_SND_HDA_PATCH_LOADER 436 436 if (loadable_patch[hda_pvt->dev_index] && *loadable_patch[hda_pvt->dev_index]) { 437 + const struct firmware *fw; 438 + 437 439 dev_info(&hdev->dev, "Applying patch firmware '%s'\n", 438 440 loadable_patch[hda_pvt->dev_index]); 439 - ret = request_firmware(&hda_pvt->fw, loadable_patch[hda_pvt->dev_index], 441 + ret = request_firmware(&fw, loadable_patch[hda_pvt->dev_index], 440 442 &hdev->dev); 441 443 if (ret < 0) 442 444 goto error_no_pm; 443 - if (hda_pvt->fw) { 444 - ret = snd_hda_load_patch(hcodec->bus, hda_pvt->fw->size, hda_pvt->fw->data); 445 + if (fw) { 446 + ret = snd_hda_load_patch(hcodec->bus, fw->size, fw->data); 445 447 if (ret < 0) { 446 448 dev_err(&hdev->dev, "failed to load hda patch %d\n", ret); 447 449 goto error_no_pm; 448 450 } 449 - release_firmware(hda_pvt->fw); 450 - hda_pvt->fw = NULL; 451 + release_firmware(fw); 451 452 } 452 453 } 453 454 #endif
-3
sound/soc/codecs/hdac_hda.h
··· 27 27 struct hdac_hda_pcm pcm[HDAC_DAI_ID_NUM]; 28 28 bool need_display_power; 29 29 int dev_index; 30 - #ifdef CONFIG_SND_HDA_PATCH_LOADER 31 - const struct firmware *fw; 32 - #endif 33 30 }; 34 31 35 32 struct hdac_ext_bus_ops *snd_soc_hdac_hda_get_ops(void);