Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bda17b82 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

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
Loading
Loading
Loading
Loading
+17 −7
Original line number Original line Diff line number Diff line
@@ -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 *
snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
				    hda_jack_callback cb)
				    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);


+3 −2
Original line number Original line Diff line number Diff line
@@ -47,7 +47,8 @@ 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 *
snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
				    hda_jack_callback cb);
				    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,
+6 −8
Original line number Original line Diff line number Diff line
@@ -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,
		/* 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;