[alsa-devel] [PATCH] hda: add support for jack detection on IDT/Sigmatel

Takashi Iwai tiwai at suse.de
Wed Oct 15 17:35:54 CEST 2008


At Wed, 15 Oct 2008 11:19:10 -0400,
Matthew Ranostay wrote:
> 
> Takashi Iwai wrote:
> > At Wed, 15 Oct 2008 10:43:28 -0400,
> > Matthew Ranostay wrote:
> >> diff --git a/core/jack.c b/core/jack.c
> >> index 8133a2b..7a5b07b 100644
> >> --- a/core/jack.c
> >> +++ b/core/jack.c
> >> @@ -95,7 +95,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
> >>  		goto fail_input;
> >>  	}
> >>
> >> -	jack->input_dev->phys = "ALSA";
> >> +	jack->input_dev->phys = "ALSA Jack Detection";
> > 
> > Any reason to change?
> > 
> > Well, I think even the original phys value "ALSA" is a bit strange in
> > comparison with values of other input drivers, such as
> > "isa0060/serio0/input0", "PNP0C0C/button/input0", too...
> > Mark, what do you think?
> > 
> > 
> >>  	jack->type = type;
> >>
> >> diff --git a/pci/Kconfig b/pci/Kconfig
> >> index 7003711..7e40890 100644
> >> --- a/pci/Kconfig
> >> +++ b/pci/Kconfig
> >> @@ -501,6 +501,7 @@ config SND_HDA_INTEL
> >>  	tristate "Intel HD Audio"
> >>  	select SND_PCM
> >>  	select SND_VMASTER
> >> +	select SND_JACK if INPUT=y || INPUT=SND
> >>  	help
> >>  	  Say Y here to include support for Intel "High Definition
> >>  	  Audio" (Azalia) motherboard devices.
> >> diff --git a/pci/hda/hda_codec.h b/pci/hda/hda_codec.h
> >> index 60468f5..93dc961 100644
> >> --- a/pci/hda/hda_codec.h
> >> +++ b/pci/hda/hda_codec.h
> >> @@ -729,6 +729,9 @@ struct hda_codec {
> >>
> >>  	struct snd_hwdep *hwdep;	/* assigned hwdep device */
> >>
> >> +	/* jack detection */
> >> +	struct snd_jack *jack;
> >> +
> >>  	/* misc flags */
> >>  	unsigned int spdif_status_reset :1; /* needs to toggle SPDIF for each
> >>  					     * status change
> > 
> > Does this have to be in hda_codec core now?  Maybe later, but I feel
> > it's too early to change the core side unless you really need it.
> > Note that you may have multiple headphone, mic, line-in and whatever
> > jacks.  So, if any, it should be either an array or a list as a more
> > generic representation.
> > 
> > And, if you add struct snd_jack there, include <sound/jack.h> in that
> > header, or add a forward declaration of the struct.
> > 
> > 
> >> diff --git a/pci/hda/hda_proc.c b/pci/hda/hda_proc.c
> >> index 743d779..e07652a 100644
> >> --- a/pci/hda/hda_proc.c
> >> +++ b/pci/hda/hda_proc.c
> >> @@ -425,6 +425,22 @@ static void print_unsol_cap(struct snd_info_buffer *buffer,
> >>  		    (unsol & AC_UNSOL_ENABLED) ? 1 : 0);
> >>  }
> >>
> >> +static void print_presence_cap(struct snd_info_buffer *buffer,
> >> +			      struct hda_codec *codec, hda_nid_t nid)
> >> +{
> >> +	int presence = snd_hda_codec_read(codec, nid, 0,
> >> +			AC_VERB_GET_PIN_SENSE, 0);
> >> +	int def_conf = snd_hda_codec_read(codec, nid, 0,
> >> +			AC_VERB_GET_CONFIG_DEFAULT, 0x00);
> >> +	def_conf = get_defcfg_connect(def_conf);
> >> +	if (def_conf && def_conf != AC_JACK_PORT_FIXED)
> >> +		return;
> >> +	snd_iprintf(buffer,
> >> +			"  Jack Presence: %s\n",
> >> +			(presence & AC_PINSENSE_PRESENCE)
> >> +				? "Plugged in" : "Unplugged");
> >> +}
> >> +
> >>  static void print_proc_caps(struct snd_info_buffer *buffer,
> >>  			    struct hda_codec *codec, hda_nid_t nid)
> >>  {
> >> @@ -552,6 +568,9 @@ static void print_codec_info(struct snd_info_entry *entry,
> >>  					   AC_PAR_AUDIO_WIDGET_CAP);
> >>  		unsigned int wid_type =
> >>  			(wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
> >> +		unsigned int pincap = snd_hda_param_read(codec, nid,
> >> +					 AC_PAR_PIN_CAP);
> >> +
> >>  		hda_nid_t conn[HDA_MAX_CONNECTIONS];
> >>  		int conn_len = 0;
> >>
> >> @@ -632,6 +651,9 @@ static void print_codec_info(struct snd_info_entry *entry,
> >>  		if (wid_caps & AC_WCAP_UNSOL_CAP)
> >>  			print_unsol_cap(buffer, codec, nid);
> >>
> >> +		if (pincap & AC_PINCAP_PRES_DETECT)
> >> +			print_presence_cap(buffer, codec, nid);
> >> +
> >>  		if (wid_caps & AC_WCAP_POWER)
> >>  			print_power_state(buffer, codec, nid);
> > 
> > Sorry, I don't want to put this into proc file.  In some obscure
> > hardwares, you can't call jack-detect verb always even if the pin
> > shows it's possible, and it breaks the later jack-sense reading
> > (believe nor not :)  In some cases, it needs triggering.
> > So, "just read" is dangerous. 
> So what is the safest way to report the initial state of the jacks then?

Purely depends on the hardware.  Really.
In most hardwares, just reading jack-sense verb would be fine, though.


Takashi


More information about the Alsa-devel mailing list