[alsa-devel] [PATCH 4/4] ALSA: CA0132: Update hp unsol event handler
Takashi Iwai
tiwai at suse.de
Sun Feb 10 11:52:20 CET 2013
At Fri, 8 Feb 2013 18:31:45 -0800,
Ian Minett wrote:
>
> From: Ian Minett <ian_minett at creativelabs.com>
>
> Manage the delayed work queue in hp unsol event handler.
Could you explain why this is needed at all?
We can't take a patch changing something without reasons.
thanks,
Takashi
>
> Signed-off-by: Ian Minett <ian_minett at creativelabs.com>
>
> diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c
> index c797f65..61d74db 100644
> --- a/sound/pci/hda/patch_ca0132.c
> +++ b/sound/pci/hda/patch_ca0132.c
> @@ -749,6 +749,9 @@ struct ca0132_spec {
> long voicefx_val;
> long cur_mic_boost;
>
> + struct hda_codec *codec;
> + struct delayed_work unsol_hp_work;
> +
> #ifdef ENABLE_TUNING_CONTROLS
> long cur_ctl_vals[TUNING_CTLS_COUNT];
> #endif
> @@ -3338,6 +3341,14 @@ exit:
> return err < 0 ? err : 0;
> }
>
> +static void ca0132_unsol_hp_delayed(struct work_struct *work)
> +{
> + struct ca0132_spec *spec = container_of(
> + to_delayed_work(work), struct ca0132_spec, unsol_hp_work);
> + ca0132_select_out(spec->codec);
> + snd_hda_jack_report_sync(spec->codec);
> +}
> +
> static void ca0132_set_dmic(struct hda_codec *codec, int enable);
> static int ca0132_mic_boost_set(struct hda_codec *codec, long val);
> static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val);
> @@ -4540,8 +4551,9 @@ static void ca0132_process_dsp_response(struct hda_codec *codec)
>
> static void ca0132_unsol_event(struct hda_codec *codec, unsigned int res)
> {
> - snd_printdd(KERN_INFO "ca0132_unsol_event: 0x%x\n", res);
> + struct ca0132_spec *spec = codec->spec;
>
> + snd_printdd(KERN_INFO "ca0132_unsol_event: 0x%x\n", res);
>
> if (((res >> AC_UNSOL_RES_TAG_SHIFT) & 0x3f) == UNSOL_TAG_DSP) {
> ca0132_process_dsp_response(codec);
> @@ -4553,8 +4565,10 @@ static void ca0132_unsol_event(struct hda_codec *codec, unsigned int res)
>
> switch (res) {
> case UNSOL_TAG_HP:
> - ca0132_select_out(codec);
> - snd_hda_jack_report_sync(codec);
> + cancel_delayed_work_sync(&spec->unsol_hp_work);
> + queue_delayed_work(codec->bus->workq,
> + &spec->unsol_hp_work,
> + msecs_to_jiffies(500));
> break;
> case UNSOL_TAG_AMIC1:
> ca0132_select_mic(codec);
> @@ -4729,6 +4743,7 @@ static void ca0132_free(struct hda_codec *codec)
> {
> struct ca0132_spec *spec = codec->spec;
>
> + cancel_delayed_work_sync(&spec->unsol_hp_work);
> snd_hda_power_up(codec);
> snd_hda_sequence_write(codec, spec->base_exit_verbs);
> ca0132_exit_chip(codec);
> @@ -4794,6 +4809,7 @@ static int patch_ca0132(struct hda_codec *codec)
> if (!spec)
> return -ENOMEM;
> codec->spec = spec;
> + spec->codec = codec;
>
> spec->num_mixers = 1;
> spec->mixers[0] = ca0132_mixer;
> @@ -4804,6 +4820,8 @@ static int patch_ca0132(struct hda_codec *codec)
> spec->init_verbs[1] = ca0132_init_verbs1;
> spec->num_init_verbs = 2;
>
> + INIT_DELAYED_WORK(&spec->unsol_hp_work, ca0132_unsol_hp_delayed);
> +
> ca0132_init_chip(codec);
>
> ca0132_config(codec);
> --
> 1.7.4.1
>
More information about the Alsa-devel
mailing list