2005-04-17 02:20:36 +04:00
# ifndef __SOUND_CORE_H
# define __SOUND_CORE_H
/*
* Main header file for the ALSA driver
2007-10-15 11:50:19 +04:00
* Copyright ( c ) 1994 - 2001 by Jaroslav Kysela < perex @ perex . cz >
2005-04-17 02:20:36 +04:00
*
*
* This program 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 .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
2008-01-08 20:13:27 +03:00
# include <linux/module.h>
2005-04-17 02:20:36 +04:00
# include <linux/sched.h> /* wake_up() */
2006-01-16 18:29:08 +03:00
# include <linux/mutex.h> /* struct mutex */
2005-04-17 02:20:36 +04:00
# include <linux/rwsem.h> /* struct rw_semaphore */
# include <linux/pm.h> /* pm_message_t */
2006-09-06 16:27:46 +04:00
# include <linux/device.h>
2008-08-08 19:06:01 +04:00
# include <linux/stringify.h>
2005-04-17 02:20:36 +04:00
2008-01-08 20:13:27 +03:00
/* number of supported soundcards */
# ifdef CONFIG_SND_DYNAMIC_MINORS
# define SNDRV_CARDS 32
# else
# define SNDRV_CARDS 8 /* don't change - minor numbers */
# endif
# define CONFIG_SND_MAJOR 116 /* standard configuration */
2005-04-17 02:20:36 +04:00
/* forward declarations */
# ifdef CONFIG_PCI
struct pci_dev ;
# endif
/* device allocation stuff */
# define SNDRV_DEV_TYPE_RANGE_SIZE 0x1000
2005-11-17 15:51:18 +03:00
typedef int __bitwise snd_device_type_t ;
# define SNDRV_DEV_TOPLEVEL ((__force snd_device_type_t) 0)
# define SNDRV_DEV_CONTROL ((__force snd_device_type_t) 1)
# define SNDRV_DEV_LOWLEVEL_PRE ((__force snd_device_type_t) 2)
# define SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000)
# define SNDRV_DEV_PCM ((__force snd_device_type_t) 0x1001)
# define SNDRV_DEV_RAWMIDI ((__force snd_device_type_t) 0x1002)
# define SNDRV_DEV_TIMER ((__force snd_device_type_t) 0x1003)
# define SNDRV_DEV_SEQUENCER ((__force snd_device_type_t) 0x1004)
# define SNDRV_DEV_HWDEP ((__force snd_device_type_t) 0x1005)
# define SNDRV_DEV_INFO ((__force snd_device_type_t) 0x1006)
# define SNDRV_DEV_BUS ((__force snd_device_type_t) 0x1007)
# define SNDRV_DEV_CODEC ((__force snd_device_type_t) 0x1008)
2008-07-28 22:05:35 +04:00
# define SNDRV_DEV_JACK ((__force snd_device_type_t) 0x1009)
2005-11-17 15:51:18 +03:00
# define SNDRV_DEV_LOWLEVEL ((__force snd_device_type_t) 0x2000)
typedef int __bitwise snd_device_state_t ;
# define SNDRV_DEV_BUILD ((__force snd_device_state_t) 0)
# define SNDRV_DEV_REGISTERED ((__force snd_device_state_t) 1)
# define SNDRV_DEV_DISCONNECTED ((__force snd_device_state_t) 2)
typedef int __bitwise snd_device_cmd_t ;
# define SNDRV_DEV_CMD_PRE ((__force snd_device_cmd_t) 0)
# define SNDRV_DEV_CMD_NORMAL ((__force snd_device_cmd_t) 1)
# define SNDRV_DEV_CMD_POST ((__force snd_device_cmd_t) 2)
struct snd_device ;
struct snd_device_ops {
int ( * dev_free ) ( struct snd_device * dev ) ;
int ( * dev_register ) ( struct snd_device * dev ) ;
int ( * dev_disconnect ) ( struct snd_device * dev ) ;
} ;
struct snd_device {
2005-04-17 02:20:36 +04:00
struct list_head list ; /* list of registered devices */
2005-11-17 15:51:18 +03:00
struct snd_card * card ; /* card which holds this device */
2005-04-17 02:20:36 +04:00
snd_device_state_t state ; /* state of the device */
snd_device_type_t type ; /* device type */
void * device_data ; /* device structure */
2005-11-17 15:51:18 +03:00
struct snd_device_ops * ops ; /* operations */
2005-04-17 02:20:36 +04:00
} ;
2005-11-17 15:51:18 +03:00
# define snd_device(n) list_entry(n, struct snd_device, list)
2005-04-17 02:20:36 +04:00
/* main structure for soundcard */
2005-11-17 15:51:18 +03:00
struct snd_card {
2005-06-29 21:31:06 +04:00
int number ; /* number of soundcard (index to
snd_cards ) */
2005-04-17 02:20:36 +04:00
char id [ 16 ] ; /* id string of this card */
char driver [ 16 ] ; /* driver name */
char shortname [ 32 ] ; /* short name of this soundcard */
char longname [ 80 ] ; /* name of this soundcard */
char mixername [ 80 ] ; /* mixer name */
2008-10-07 13:38:09 +04:00
char components [ 128 ] ; /* card components delimited with
2005-06-29 21:31:06 +04:00
space */
2005-04-17 02:20:36 +04:00
struct module * module ; /* top-level module */
void * private_data ; /* private data for soundcard */
2005-11-17 15:51:18 +03:00
void ( * private_free ) ( struct snd_card * card ) ; /* callback for freeing of
2005-06-29 21:31:06 +04:00
private data */
2005-04-17 02:20:36 +04:00
struct list_head devices ; /* devices */
unsigned int last_numid ; /* last used numeric ID */
struct rw_semaphore controls_rwsem ; /* controls list lock */
rwlock_t ctl_files_rwlock ; /* ctl_files list lock */
int controls_count ; /* count of all controls */
int user_ctl_count ; /* count of all user controls */
struct list_head controls ; /* all controls for this card */
struct list_head ctl_files ; /* active control files */
2005-11-17 15:51:18 +03:00
struct snd_info_entry * proc_root ; /* root for soundcard specific files */
struct snd_info_entry * proc_id ; /* the card id */
2005-04-17 02:20:36 +04:00
struct proc_dir_entry * proc_root_link ; /* number link to real id */
2009-02-23 18:35:21 +03:00
struct list_head files_list ; /* all files associated to this card */
2005-06-29 21:31:06 +04:00
struct snd_shutdown_f_ops * s_f_ops ; /* file operations in the shutdown
state */
2005-04-17 02:20:36 +04:00
spinlock_t files_lock ; /* lock the files for this card */
int shutdown ; /* this card is going down */
2006-06-23 16:38:23 +04:00
int free_on_last_close ; /* free in context of file_release */
2005-04-17 02:20:36 +04:00
wait_queue_head_t shutdown_sleep ;
2007-01-26 14:40:31 +03:00
struct device * dev ; /* device assigned to this card */
# ifndef CONFIG_SYSFS_DEPRECATED
struct device * card_dev ; /* cardX object for sysfs */
# endif
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_PM
unsigned int power_state ; /* power state */
2006-01-16 18:29:08 +03:00
struct mutex power_lock ; /* power lock */
2005-04-17 02:20:36 +04:00
wait_queue_head_t power_sleep ;
# endif
# if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
2005-11-17 15:51:18 +03:00
struct snd_mixer_oss * mixer_oss ;
2005-04-17 02:20:36 +04:00
int mixer_oss_change_count ;
# endif
} ;
# ifdef CONFIG_PM
2005-11-17 15:51:18 +03:00
static inline void snd_power_lock ( struct snd_card * card )
2005-04-17 02:20:36 +04:00
{
2006-01-16 18:29:08 +03:00
mutex_lock ( & card - > power_lock ) ;
2005-04-17 02:20:36 +04:00
}
2005-11-17 15:51:18 +03:00
static inline void snd_power_unlock ( struct snd_card * card )
2005-04-17 02:20:36 +04:00
{
2006-01-16 18:29:08 +03:00
mutex_unlock ( & card - > power_lock ) ;
2005-04-17 02:20:36 +04:00
}
2005-11-17 15:51:18 +03:00
static inline unsigned int snd_power_get_state ( struct snd_card * card )
2005-04-17 02:20:36 +04:00
{
return card - > power_state ;
}
2005-11-17 15:51:18 +03:00
static inline void snd_power_change_state ( struct snd_card * card , unsigned int state )
2005-04-17 02:20:36 +04:00
{
card - > power_state = state ;
wake_up ( & card - > power_sleep ) ;
}
2005-06-29 21:31:06 +04:00
/* init.c */
2006-03-27 14:38:07 +04:00
int snd_power_wait ( struct snd_card * card , unsigned int power_state ) ;
2005-06-29 21:31:06 +04:00
2005-04-17 02:20:36 +04:00
# else /* ! CONFIG_PM */
# define snd_power_lock(card) do { (void)(card); } while (0)
# define snd_power_unlock(card) do { (void)(card); } while (0)
2006-04-03 01:37:36 +04:00
static inline int snd_power_wait ( struct snd_card * card , unsigned int state ) { return 0 ; }
2005-04-17 02:20:36 +04:00
# define snd_power_get_state(card) SNDRV_CTL_POWER_D0
# define snd_power_change_state(card, state) do { (void)(card); } while (0)
# endif /* CONFIG_PM */
2005-11-17 15:51:18 +03:00
struct snd_minor {
2005-11-20 16:03:48 +03:00
int type ; /* SNDRV_DEVICE_TYPE_XXX */
2005-11-20 16:05:49 +03:00
int card ; /* card number */
2005-04-17 02:20:36 +04:00
int device ; /* device number */
2006-03-28 13:56:41 +04:00
const struct file_operations * f_ops ; /* file operations */
2005-11-20 16:06:59 +03:00
void * private_data ; /* private data for f_ops->open */
2006-08-08 09:19:37 +04:00
struct device * dev ; /* device for sysfs */
2005-04-17 02:20:36 +04:00
} ;
2007-01-26 14:40:31 +03:00
/* return a device pointer linked to each sound device as a parent */
static inline struct device * snd_card_get_device_link ( struct snd_card * card )
{
# ifdef CONFIG_SYSFS_DEPRECATED
return card ? card - > dev : NULL ;
# else
return card ? card - > card_dev : NULL ;
# endif
}
2005-04-17 02:20:36 +04:00
/* sound.c */
2005-10-24 19:05:03 +04:00
extern int snd_major ;
2005-04-17 02:20:36 +04:00
extern int snd_ecards_limit ;
2006-08-08 09:19:37 +04:00
extern struct class * sound_class ;
2005-04-17 02:20:36 +04:00
void snd_request_card ( int card ) ;
2006-10-05 17:05:34 +04:00
int snd_register_device_for_dev ( int type , struct snd_card * card ,
int dev ,
const struct file_operations * f_ops ,
void * private_data ,
const char * name ,
struct device * device ) ;
/**
* snd_register_device - Register the ALSA device file for the card
* @ type : the device type , SNDRV_DEVICE_TYPE_XXX
* @ card : the card instance
* @ dev : the device index
* @ f_ops : the file operations
* @ private_data : user pointer for f_ops - > open ( )
* @ name : the device file name
*
* Registers an ALSA device file for the given card .
* The operators have to be set in reg parameter .
*
* This function uses the card ' s device pointer to link to the
* correct & struct device .
*
* Returns zero if successful , or a negative error code on failure .
*/
static inline int snd_register_device ( int type , struct snd_card * card , int dev ,
const struct file_operations * f_ops ,
void * private_data ,
const char * name )
{
return snd_register_device_for_dev ( type , card , dev , f_ops ,
private_data , name ,
2007-02-09 18:25:48 +03:00
snd_card_get_device_link ( card ) ) ;
2006-10-05 17:05:34 +04:00
}
2005-11-17 15:51:18 +03:00
int snd_unregister_device ( int type , struct snd_card * card , int dev ) ;
2005-11-20 16:06:59 +03:00
void * snd_lookup_minor_data ( unsigned int minor , int type ) ;
2006-09-06 16:27:46 +04:00
int snd_add_device_sysfs_file ( int type , struct snd_card * card , int dev ,
2006-08-08 09:19:37 +04:00
struct device_attribute * attr ) ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_SND_OSSEMUL
2005-11-20 16:03:48 +03:00
int snd_register_oss_device ( int type , struct snd_card * card , int dev ,
2006-03-28 13:56:41 +04:00
const struct file_operations * f_ops , void * private_data ,
2005-11-20 16:06:59 +03:00
const char * name ) ;
2005-11-17 15:51:18 +03:00
int snd_unregister_oss_device ( int type , struct snd_card * card , int dev ) ;
2005-11-20 16:06:59 +03:00
void * snd_lookup_oss_minor_data ( unsigned int minor , int type ) ;
2005-04-17 02:20:36 +04:00
# endif
int snd_minor_info_init ( void ) ;
int snd_minor_info_done ( void ) ;
/* sound_oss.c */
# ifdef CONFIG_SND_OSSEMUL
int snd_minor_info_oss_init ( void ) ;
int snd_minor_info_oss_done ( void ) ;
# else
2008-04-14 20:31:35 +04:00
static inline int snd_minor_info_oss_init ( void ) { return 0 ; }
static inline int snd_minor_info_oss_done ( void ) { return 0 ; }
2005-04-17 02:20:36 +04:00
# endif
/* memory.c */
int copy_to_user_fromio ( void __user * dst , const volatile void __iomem * src , size_t count ) ;
int copy_from_user_toio ( volatile void __iomem * dst , const void __user * src , size_t count ) ;
/* init.c */
2005-11-17 15:51:18 +03:00
extern struct snd_card * snd_cards [ SNDRV_CARDS ] ;
2006-05-15 21:49:05 +04:00
int snd_card_locked ( int card ) ;
2005-04-17 02:20:36 +04:00
# if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
# define SND_MIXER_OSS_NOTIFY_REGISTER 0
# define SND_MIXER_OSS_NOTIFY_DISCONNECT 1
# define SND_MIXER_OSS_NOTIFY_FREE 2
2005-11-17 15:51:18 +03:00
extern int ( * snd_mixer_oss_notify_callback ) ( struct snd_card * card , int cmd ) ;
2005-04-17 02:20:36 +04:00
# endif
2008-12-28 18:32:08 +03:00
int snd_card_create ( int idx , const char * id ,
struct module * module , int extra_size ,
struct snd_card * * card_ret ) ;
2005-11-17 15:51:18 +03:00
int snd_card_disconnect ( struct snd_card * card ) ;
int snd_card_free ( struct snd_card * card ) ;
2006-06-23 16:38:23 +04:00
int snd_card_free_when_closed ( struct snd_card * card ) ;
2009-06-02 14:02:38 +04:00
void snd_card_set_id ( struct snd_card * card , const char * id ) ;
2005-11-17 15:51:18 +03:00
int snd_card_register ( struct snd_card * card ) ;
2005-04-17 02:20:36 +04:00
int snd_card_info_init ( void ) ;
int snd_card_info_done ( void ) ;
2005-11-17 15:51:18 +03:00
int snd_component_add ( struct snd_card * card , const char * component ) ;
int snd_card_file_add ( struct snd_card * card , struct file * file ) ;
int snd_card_file_remove ( struct snd_card * card , struct file * file ) ;
2005-04-17 02:20:36 +04:00
2008-04-01 17:33:22 +04:00
# define snd_card_set_dev(card, devptr) ((card)->dev = (devptr))
2005-04-17 02:20:36 +04:00
/* device.c */
2005-11-17 15:51:18 +03:00
int snd_device_new ( struct snd_card * card , snd_device_type_t type ,
void * device_data , struct snd_device_ops * ops ) ;
int snd_device_register ( struct snd_card * card , void * device_data ) ;
int snd_device_register_all ( struct snd_card * card ) ;
int snd_device_disconnect ( struct snd_card * card , void * device_data ) ;
int snd_device_disconnect_all ( struct snd_card * card ) ;
int snd_device_free ( struct snd_card * card , void * device_data ) ;
int snd_device_free_all ( struct snd_card * card , snd_device_cmd_t cmd ) ;
2005-04-17 02:20:36 +04:00
/* isadma.c */
2005-08-24 01:45:06 +04:00
# ifdef CONFIG_ISA_DMA_API
2005-04-17 02:20:36 +04:00
# define DMA_MODE_NO_ENABLE 0x0100
void snd_dma_program ( unsigned long dma , unsigned long addr , unsigned int size , unsigned short mode ) ;
void snd_dma_disable ( unsigned long dma ) ;
unsigned int snd_dma_pointer ( unsigned long dma , unsigned int size ) ;
2005-08-24 01:45:06 +04:00
# endif
2005-04-17 02:20:36 +04:00
/* misc.c */
2005-10-11 19:28:58 +04:00
struct resource ;
2005-10-10 13:56:31 +04:00
void release_and_free_resource ( struct resource * res ) ;
2005-04-17 02:20:36 +04:00
/* --- */
2009-08-27 18:45:07 +04:00
# if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
void __snd_printk ( unsigned int level , const char * file , int line ,
const char * format , . . . )
__attribute__ ( ( format ( printf , 4 , 5 ) ) ) ;
# else
# define __snd_printk(level, file, line, format, args...) \
2009-08-28 09:22:05 +04:00
printk ( format , # # args )
2009-08-27 18:45:07 +04:00
# endif
2005-04-17 02:20:36 +04:00
/**
* snd_printk - printk wrapper
* @ fmt : format string
*
2008-11-07 11:37:22 +03:00
* Works like printk ( ) but prints the file and the line of the caller
2005-04-17 02:20:36 +04:00
* when configured with CONFIG_SND_VERBOSE_PRINTK .
*/
# define snd_printk(fmt, args...) \
2009-08-27 18:45:07 +04:00
__snd_printk ( 0 , __FILE__ , __LINE__ , fmt , # # args )
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_SND_DEBUG
/**
* snd_printd - debug printk
2006-01-10 07:53:55 +03:00
* @ fmt : format string
2005-04-17 02:20:36 +04:00
*
2008-04-01 17:33:22 +04:00
* Works like snd_printk ( ) for debugging purposes .
2005-04-17 02:20:36 +04:00
* Ignored when CONFIG_SND_DEBUG is not set .
*/
# define snd_printd(fmt, args...) \
2009-08-27 18:45:07 +04:00
__snd_printk ( 1 , __FILE__ , __LINE__ , fmt , # # args )
2005-10-10 13:46:31 +04:00
2008-11-07 11:37:22 +03:00
/**
* snd_BUG - give a BUG warning message and stack trace
*
* Calls WARN ( ) if CONFIG_SND_DEBUG is set .
* Ignored when CONFIG_SND_DEBUG is not set .
*/
2008-08-08 19:18:08 +04:00
# define snd_BUG() WARN(1, "BUG?\n")
2008-11-07 11:37:22 +03:00
/**
* snd_BUG_ON - debugging check macro
* @ cond : condition to evaluate
*
* When CONFIG_SND_DEBUG is set , this macro evaluates the given condition ,
* and call WARN ( ) and returns the value if it ' s non - zero .
*
* When CONFIG_SND_DEBUG is not set , this just returns zero , and the given
* condition is ignored .
*
* NOTE : the argument won ' t be evaluated at all when CONFIG_SND_DEBUG = n .
* Thus , don ' t put any statement that influences on the code behavior ,
* such as pre / post increment , to the argument of this macro .
* If you want to evaluate and give a warning , use standard WARN_ON ( ) .
*/
2008-08-08 19:06:01 +04:00
# define snd_BUG_ON(cond) WARN((cond), "BUG? (%s)\n", __stringify(cond))
2005-04-17 02:20:36 +04:00
# else /* !CONFIG_SND_DEBUG */
2008-11-06 23:05:21 +03:00
# define snd_printd(fmt, args...) do { } while (0)
# define snd_BUG() do { } while (0)
2008-11-07 11:08:15 +03:00
static inline int __snd_bug_on ( int cond )
2008-11-06 23:05:21 +03:00
{
return 0 ;
}
2008-11-07 11:08:15 +03:00
# define snd_BUG_ON(cond) __snd_bug_on(0 && (cond)) /* always false */
2005-04-17 02:20:36 +04:00
# endif /* CONFIG_SND_DEBUG */
2008-05-20 14:15:15 +04:00
# ifdef CONFIG_SND_DEBUG_VERBOSE
2005-04-17 02:20:36 +04:00
/**
* snd_printdd - debug printk
* @ format : format string
*
2008-04-01 17:33:22 +04:00
* Works like snd_printk ( ) for debugging purposes .
2008-05-20 14:15:15 +04:00
* Ignored when CONFIG_SND_DEBUG_VERBOSE is not set .
2005-04-17 02:20:36 +04:00
*/
2009-08-27 18:45:07 +04:00
# define snd_printdd(format, args...) \
__snd_printk ( 2 , __FILE__ , __LINE__ , format , # # args )
2005-04-17 02:20:36 +04:00
# else
2009-08-27 18:45:07 +04:00
# define snd_printdd(format, args...) do { } while (0)
2005-04-17 02:20:36 +04:00
# endif
# define SNDRV_OSS_VERSION ((3<<16)|(8<<8)|(1<<4)|(0)) /* 3.8.1a */
/* for easier backward-porting */
# if defined(CONFIG_GAMEPORT) || defined(CONFIG_GAMEPORT_MODULE)
# define gameport_set_dev_parent(gp,xdev) ((gp)->dev.parent = (xdev))
# define gameport_set_port_data(gp,r) ((gp)->port_data = (r))
# define gameport_get_port_data(gp) (gp)->port_data
# endif
2006-11-24 17:34:06 +03:00
/* PCI quirk list helper */
struct snd_pci_quirk {
unsigned short subvendor ; /* PCI subvendor ID */
unsigned short subdevice ; /* PCI subdevice ID */
2009-01-30 19:27:45 +03:00
unsigned short subdevice_mask ; /* bitmask to match */
2006-11-24 17:34:06 +03:00
int value ; /* value */
2008-05-20 14:15:15 +04:00
# ifdef CONFIG_SND_DEBUG_VERBOSE
2006-11-24 17:34:06 +03:00
const char * name ; /* name of the device (optional) */
# endif
} ;
2009-01-30 19:27:45 +03:00
# define _SND_PCI_QUIRK_ID_MASK(vend, mask, dev) \
. subvendor = ( vend ) , . subdevice = ( dev ) , . subdevice_mask = ( mask )
# define _SND_PCI_QUIRK_ID(vend, dev) \
_SND_PCI_QUIRK_ID_MASK ( vend , 0xffff , dev )
2006-11-24 17:34:06 +03:00
# define SND_PCI_QUIRK_ID(vend,dev) {_SND_PCI_QUIRK_ID(vend, dev)}
2008-05-20 14:15:15 +04:00
# ifdef CONFIG_SND_DEBUG_VERBOSE
2006-11-24 17:34:06 +03:00
# define SND_PCI_QUIRK(vend,dev,xname,val) \
{ _SND_PCI_QUIRK_ID ( vend , dev ) , . value = ( val ) , . name = ( xname ) }
2009-01-30 19:27:45 +03:00
# define SND_PCI_QUIRK_VENDOR(vend, xname, val) \
{ _SND_PCI_QUIRK_ID_MASK ( vend , 0 , 0 ) , . value = ( val ) , . name = ( xname ) }
# define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val) \
{ _SND_PCI_QUIRK_ID_MASK ( vend , mask , dev ) , \
. value = ( val ) , . name = ( xname ) }
2006-11-24 17:34:06 +03:00
# else
# define SND_PCI_QUIRK(vend,dev,xname,val) \
{ _SND_PCI_QUIRK_ID ( vend , dev ) , . value = ( val ) }
2009-01-30 19:27:45 +03:00
# define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val) \
{ _SND_PCI_QUIRK_ID_MASK ( vend , mask , dev ) , . value = ( val ) }
# define SND_PCI_QUIRK_VENDOR(vend, xname, val) \
{ _SND_PCI_QUIRK_ID_MASK ( vend , 0 , 0 ) , . value = ( val ) }
2006-11-24 17:34:06 +03:00
# endif
const struct snd_pci_quirk *
snd_pci_quirk_lookup ( struct pci_dev * pci , const struct snd_pci_quirk * list ) ;
2010-01-14 11:16:52 +03:00
const struct snd_pci_quirk *
snd_pci_quirk_lookup_id ( u16 vendor , u16 device ,
const struct snd_pci_quirk * list ) ;
2006-11-24 17:34:06 +03:00
2005-04-17 02:20:36 +04:00
# endif /* __SOUND_CORE_H */