Commit bda17b82 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Make snd_hda_jack_detect_enable_callback() returning the jack object

STAC/IDT driver calls snd_hda_jack_tbl_get() again after calling
snd_hda_jack_detect_enable_callback().  For simplifying this, let's
make snd_hda_jack_detect_enable_callback() returning the pointer while
handling the error with the standard IS_ERR() & co.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 81965f1f
...@@ -214,29 +214,39 @@ EXPORT_SYMBOL_GPL(snd_hda_jack_detect_state); ...@@ -214,29 +214,39 @@ EXPORT_SYMBOL_GPL(snd_hda_jack_detect_state);
/** /**
* snd_hda_jack_detect_enable - enable the jack-detection * snd_hda_jack_detect_enable - enable the jack-detection
*
* In the case of error, the return value will be a pointer embedded with
* errno. Check and handle the return value appropriately with standard
* macros such as @IS_ERR() and @PTR_ERR().
*/ */
int snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid, struct hda_jack_tbl *
hda_jack_callback cb) snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
hda_jack_callback cb)
{ {
struct hda_jack_tbl *jack = snd_hda_jack_tbl_new(codec, nid); struct hda_jack_tbl *jack = snd_hda_jack_tbl_new(codec, nid);
int err;
if (!jack) if (!jack)
return -ENOMEM; return ERR_PTR(-ENOMEM);
if (jack->jack_detect) if (jack->jack_detect)
return 0; /* already registered */ return jack; /* already registered */
jack->jack_detect = 1; jack->jack_detect = 1;
if (cb) if (cb)
jack->callback = cb; jack->callback = cb;
if (codec->jackpoll_interval > 0) if (codec->jackpoll_interval > 0)
return 0; /* No unsol if we're polling instead */ return jack; /* No unsol if we're polling instead */
return snd_hda_codec_write_cache(codec, nid, 0, err = snd_hda_codec_write_cache(codec, nid, 0,
AC_VERB_SET_UNSOLICITED_ENABLE, AC_VERB_SET_UNSOLICITED_ENABLE,
AC_USRSP_EN | jack->tag); AC_USRSP_EN | jack->tag);
if (err < 0)
return ERR_PTR(err);
return jack;
} }
EXPORT_SYMBOL_GPL(snd_hda_jack_detect_enable_callback); EXPORT_SYMBOL_GPL(snd_hda_jack_detect_enable_callback);
int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid) int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid)
{ {
return snd_hda_jack_detect_enable_callback(codec, nid, NULL); return PTR_ERR_OR_ZERO(snd_hda_jack_detect_enable_callback(codec, nid, NULL));
} }
EXPORT_SYMBOL_GPL(snd_hda_jack_detect_enable); EXPORT_SYMBOL_GPL(snd_hda_jack_detect_enable);
......
...@@ -47,8 +47,9 @@ void snd_hda_jack_tbl_clear(struct hda_codec *codec); ...@@ -47,8 +47,9 @@ void snd_hda_jack_tbl_clear(struct hda_codec *codec);
void snd_hda_jack_set_dirty_all(struct hda_codec *codec); void snd_hda_jack_set_dirty_all(struct hda_codec *codec);
int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid); int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid);
int snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid, struct hda_jack_tbl *
hda_jack_callback cb); snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
hda_jack_callback cb);
int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid, int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid,
hda_nid_t gating_nid); hda_nid_t gating_nid);
......
...@@ -3019,10 +3019,9 @@ static void stac92hd71bxx_fixup_hp_m4(struct hda_codec *codec, ...@@ -3019,10 +3019,9 @@ static void stac92hd71bxx_fixup_hp_m4(struct hda_codec *codec,
/* Enable VREF power saving on GPIO1 detect */ /* Enable VREF power saving on GPIO1 detect */
snd_hda_codec_write_cache(codec, codec->afg, 0, snd_hda_codec_write_cache(codec, codec->afg, 0,
AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
snd_hda_jack_detect_enable_callback(codec, codec->afg, jack = snd_hda_jack_detect_enable_callback(codec, codec->afg,
stac_vref_event); stac_vref_event);
jack = snd_hda_jack_tbl_get(codec, codec->afg); if (!IS_ERR(jack))
if (jack)
jack->private_data = 0x02; jack->private_data = 0x02;
spec->gpio_mask |= 0x02; spec->gpio_mask |= 0x02;
...@@ -4042,10 +4041,9 @@ static void stac9205_fixup_dell_m43(struct hda_codec *codec, ...@@ -4042,10 +4041,9 @@ static void stac9205_fixup_dell_m43(struct hda_codec *codec,
/* Enable unsol response for GPIO4/Dock HP connection */ /* Enable unsol response for GPIO4/Dock HP connection */
snd_hda_codec_write_cache(codec, codec->afg, 0, snd_hda_codec_write_cache(codec, codec->afg, 0,
AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
snd_hda_jack_detect_enable_callback(codec, codec->afg, jack = snd_hda_jack_detect_enable_callback(codec, codec->afg,
stac_vref_event); stac_vref_event);
jack = snd_hda_jack_tbl_get(codec, codec->afg); if (!IS_ERR(jack))
if (jack)
jack->private_data = 0x01; jack->private_data = 0x01;
spec->gpio_dir = 0x0b; spec->gpio_dir = 0x0b;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment