[bug report] ALSA: hda - Don't register a cb func if it is registered already
Hui Wang
hui.wang at canonical.com
Wed Oct 21 16:21:59 CEST 2020
On 10/21/20 8:19 PM, Dan Carpenter wrote:
> Hello Hui Wang,
>
> The patch f4794c6064a8: "ALSA: hda - Don't register a cb func if it
> is registered already" from Sep 30, 2020, leads to the following
> static checker warning:
>
> sound/pci/hda/patch_sigmatel.c:3075 stac92hd71bxx_fixup_hp_m4()
> warn: 'jack' can also be NULL
>
> sound/pci/hda/patch_sigmatel.c
> 3069 /* Enable VREF power saving on GPIO1 detect */
> 3070 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
> 3071 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
> 3072 jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
> 3073 stac_vref_event);
>
> Originally snd_hda_jack_detect_enable_callback() would not return NULL
> here.
>
> 3074 if (!IS_ERR(jack))
> 3075 jack->private_data = 0x02;
> 3076
> 3077 spec->gpio_mask |= 0x02;
>
> But now we have this:
>
> sound/pci/hda/hda_jack.c
> 301 struct hda_jack_callback *
> 302 snd_hda_jack_detect_enable_callback_mst(struct hda_codec *codec, hda_nid_t nid,
> 303 int dev_id, hda_jack_callback_fn func)
> 304 {
> 305 struct hda_jack_tbl *jack;
> 306 struct hda_jack_callback *callback = NULL;
> 307 int err;
> 308
> 309 jack = snd_hda_jack_tbl_new(codec, nid, dev_id);
> 310 if (!jack)
> 311 return ERR_PTR(-ENOMEM);
> 312 if (func && !func_is_already_in_callback_list(jack, func)) {
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> We only allocate callback if there isn't one already.
Yes, indeed, this is a problem.
>
> 313 callback = kzalloc(sizeof(*callback), GFP_KERNEL);
> 314 if (!callback)
> 315 return ERR_PTR(-ENOMEM);
> 316 callback->func = func;
> 317 callback->nid = jack->nid;
> 318 callback->dev_id = jack->dev_id;
> 319 callback->next = jack->callback;
> 320 jack->callback = callback;
> 321 }
> 322
> 323 if (jack->jack_detect)
> 324 return callback; /* already registered */
> ^^^^^^^^^^^^^^^
> So presumably this should be jack->callback
Looks like it is also not correct to return the jack->callback. Need to
take some time to write a fix for it.
Thanks for reporting the issue.
>
>
> 325 jack->jack_detect = 1;
> 326 if (codec->jackpoll_interval > 0)
> 327 return callback; /* No unsol if we're polling instead */
> ^^^^^^^^^^^^^^^^
>
> 328 err = snd_hda_codec_write_cache(codec, nid, 0,
> 329 AC_VERB_SET_UNSOLICITED_ENABLE,
> 330 AC_USRSP_EN | jack->tag);
> 331 if (err < 0)
> 332 return ERR_PTR(err);
> 333 return callback;
> ^^^^^^^^^^^^^^^^
> And these as well.
>
> 334 }
>
> regards,
> dan carpenter
More information about the Alsa-devel
mailing list