2011-10-28 00:12:46 +04:00
/*
* Jack - detection handling for HD - audio
*
* Copyright ( c ) 2011 Takashi Iwai < tiwai @ suse . de >
*
* This driver is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# ifndef __SOUND_HDA_JACK_H
# define __SOUND_HDA_JACK_H
struct hda_jack_tbl {
hda_nid_t nid ;
2011-10-28 03:16:55 +04:00
unsigned char action ; /* event action (0 = none) */
unsigned char tag ; /* unsol event tag */
unsigned int private_data ; /* arbitrary data */
/* jack-detection stuff */
2011-10-28 00:12:46 +04:00
unsigned int pin_sense ; /* cached pin-sense value */
2011-10-28 03:16:55 +04:00
unsigned int jack_detect : 1 ; /* capable of jack-detection? */
2011-10-28 00:12:46 +04:00
unsigned int jack_dirty : 1 ; /* needs to update? */
2011-10-28 02:03:22 +04:00
struct snd_kcontrol * kctl ; /* assigned kctl for jack-detection */
2011-11-02 11:54:51 +04:00
# ifdef CONFIG_SND_HDA_INPUT_JACK
int type ;
struct snd_jack * jack ;
# endif
2011-10-28 00:12:46 +04:00
} ;
struct hda_jack_tbl *
snd_hda_jack_tbl_get ( struct hda_codec * codec , hda_nid_t nid ) ;
2011-10-28 03:16:55 +04:00
struct hda_jack_tbl *
snd_hda_jack_tbl_get_from_tag ( struct hda_codec * codec , unsigned char tag ) ;
2011-10-28 00:12:46 +04:00
struct hda_jack_tbl *
snd_hda_jack_tbl_new ( struct hda_codec * codec , hda_nid_t nid ) ;
void snd_hda_jack_tbl_clear ( struct hda_codec * codec ) ;
/**
2011-10-28 03:16:55 +04:00
* snd_hda_jack_get_action - get jack - tbl entry for the tag
2011-10-28 00:12:46 +04:00
*
2011-10-28 03:16:55 +04:00
* Call this from the unsol event handler to get the assigned action for the
* event . This will mark the dirty flag for the later reporting , too .
2011-10-28 00:12:46 +04:00
*/
2011-10-28 03:16:55 +04:00
static inline unsigned char
snd_hda_jack_get_action ( struct hda_codec * codec , unsigned int tag )
2011-10-28 00:12:46 +04:00
{
2011-10-28 03:16:55 +04:00
struct hda_jack_tbl * jack = snd_hda_jack_tbl_get_from_tag ( codec , tag ) ;
if ( jack ) {
2011-10-28 00:12:46 +04:00
jack - > jack_dirty = 1 ;
2011-10-28 03:16:55 +04:00
return jack - > action ;
}
return 0 ;
2011-10-28 00:12:46 +04:00
}
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 ,
2011-10-28 03:16:55 +04:00
unsigned char action ) ;
2011-10-28 00:12:46 +04:00
u32 snd_hda_pin_sense ( struct hda_codec * codec , hda_nid_t nid ) ;
int snd_hda_jack_detect ( struct hda_codec * codec , hda_nid_t nid ) ;
static inline bool is_jack_detectable ( struct hda_codec * codec , hda_nid_t nid )
{
if ( ! ( snd_hda_query_pin_caps ( codec , nid ) & AC_PINCAP_PRES_DETECT ) )
return false ;
if ( ! codec - > ignore_misc_bit & &
( get_defcfg_misc ( snd_hda_codec_get_pincfg ( codec , nid ) ) &
AC_DEFCFG_MISC_NO_PRESENCE ) )
return false ;
if ( ! ( get_wcaps ( codec , nid ) & AC_WCAP_UNSOL_CAP ) )
return false ;
return true ;
}
2011-10-28 02:03:22 +04:00
int snd_hda_jack_add_kctl ( struct hda_codec * codec , hda_nid_t nid ,
const char * name , int idx ) ;
int snd_hda_jack_add_kctls ( struct hda_codec * codec ,
const struct auto_pin_cfg * cfg ) ;
void snd_hda_jack_report_sync ( struct hda_codec * codec ) ;
2011-10-28 00:12:46 +04:00
# endif /* __SOUND_HDA_JACK_H */