On Tue, 19 Sep 2023 10:32:09 +0200, Bard Liao wrote:
+#ifdef CONFIG_SND_HDA_PATCH_LOADER +static char *loadable_patch[SNDRV_CARDS];
Hm, this size looks wrong.
In the code later in this patch, dev_index points to the codec address, and it's basically irrelevant with SNDRV_CARDS. As SNDRV_CARDS might be 8 depending on the config, it can go beyond the array size, too. Use a different array size to match with the codec address ranges.
+module_param_array_named(patch, loadable_patch, charp, NULL, 0444); +MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
Better to give a bit more description; when it's a codec address array, it can be non-zero, and user may wonder why it's not applied.
+#ifdef CONFIG_SND_HDA_PATCH_LOADER
- if (loadable_patch[hda_pvt->dev_index] && *loadable_patch[hda_pvt->dev_index]) {
dev_info(&hdev->dev, "Applying patch firmware '%s'\n",
loadable_patch[hda_pvt->dev_index]);
ret = request_firmware(&hda_pvt->fw, loadable_patch[hda_pvt->dev_index],
&hdev->dev);
if (ret < 0)
goto error_no_pm;
if (hda_pvt->fw) {
ret = snd_hda_load_patch(hcodec->bus, hda_pvt->fw->size, hda_pvt->fw->data);
if (ret < 0) {
dev_err(&hdev->dev, "failed to load hda patch %d\n", ret);
goto error_no_pm;
}
release_firmware(hda_pvt->fw);
hda_pvt->fw = NULL;
So the hda_pvt->fw is only for a temporary use, already released already here. Then...
--- a/sound/soc/codecs/hdac_hda.h +++ b/sound/soc/codecs/hdac_hda.h @@ -26,6 +26,10 @@ struct hdac_hda_priv { struct hda_codec *codec; struct hdac_hda_pcm pcm[HDAC_DAI_ID_NUM]; bool need_display_power;
- int dev_index;
+#ifdef CONFIG_SND_HDA_PATCH_LOADER
- const struct firmware *fw;
+#endif
... we don't have to add a new extra field, right?
thanks,
Takashi