At Fri, 8 Feb 2013 18:31:45 -0800, Ian Minett wrote:
From: Ian Minett ian_minett@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@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,
case UNSOL_TAG_AMIC1: ca0132_select_mic(codec);msecs_to_jiffies(500)); break;
@@ -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