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
2012-05-07 19:42:31 +04:00
struct auto_pin_cfg ;
2012-09-25 13:30:59 +04:00
struct hda_jack_tbl ;
typedef void ( * hda_jack_callback ) ( struct hda_codec * , struct hda_jack_tbl * ) ;
2012-05-07 19:42:31 +04:00
2011-10-28 00:12:46 +04:00
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 */
2012-09-25 13:30:59 +04:00
hda_jack_callback callback ;
2011-10-28 03:16:55 +04:00
/* 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? */
2012-06-04 11:33:51 +04:00
unsigned int phantom_jack : 1 ; /* a fixed, always present port? */
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 ) ;
2012-09-25 13:30:59 +04:00
int snd_hda_jack_detect_enable_callback ( struct hda_codec * codec , hda_nid_t nid ,
unsigned char action ,
hda_jack_callback cb ) ;
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 ) ;
2012-02-13 14:41:42 +04:00
bool is_jack_detectable ( struct hda_codec * codec , hda_nid_t nid ) ;
2011-10-28 00:12:46 +04:00
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 ) ;
2012-09-25 13:30:59 +04:00
void snd_hda_jack_unsol_event ( struct hda_codec * codec , unsigned int res ) ;
2011-10-28 02:03:22 +04:00
2011-10-28 00:12:46 +04:00
# endif /* __SOUND_HDA_JACK_H */