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

Commit 6565e4fa authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: hda - Add more hint options for IDT/Sigmatel codecs



Allow more options to be set/reset via hwdep hint entry.
hp_detect, gpio_mask, gpio_dir, gpio_data, eapd_mask and eapd_switch
can be checked.

For example, to disable hp_detect on the fly,
	# echo "hp_detect=0" > /sys/class/sound/hwC0D0/hints

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d78d7a90
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -3949,6 +3949,36 @@ static void stac92xx_power_down(struct hda_codec *codec)
static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
				  int enable);

/* override some hints from the hwdep entry */
static void stac_store_hints(struct hda_codec *codec)
{
	struct sigmatel_spec *spec = codec->spec;
	const char *p;
	int val;

	val = snd_hda_get_bool_hint(codec, "hp_detect");
	if (val >= 0)
		spec->hp_detect = val;
	p = snd_hda_get_hint(codec, "gpio_mask");
	if (p) {
		spec->gpio_mask = simple_strtoul(p, NULL, 0);
		spec->eapd_mask = spec->gpio_dir = spec->gpio_data =
			spec->gpio_mask;
	}
	p = snd_hda_get_hint(codec, "gpio_dir");
	if (p)
		spec->gpio_dir = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
	p = snd_hda_get_hint(codec, "gpio_data");
	if (p)
		spec->gpio_data = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
	p = snd_hda_get_hint(codec, "eapd_mask");
	if (p)
		spec->eapd_mask = simple_strtoul(p, NULL, 0) & spec->gpio_mask;
	val = snd_hda_get_bool_hint(codec, "eapd_switch");
	if (val >= 0)
		spec->eapd_switch = val;
}

static int stac92xx_init(struct hda_codec *codec)
{
	struct sigmatel_spec *spec = codec->spec;
@@ -3965,6 +3995,9 @@ static int stac92xx_init(struct hda_codec *codec)
				spec->adc_nids[i], 0,
				AC_VERB_SET_POWER_STATE, AC_PWRST_D3);

	/* override some hints */
	stac_store_hints(codec);

	/* set up GPIO */
	gpio = spec->gpio_data;
	/* turn on EAPD statically when spec->eapd_switch isn't set.