vserver 1.9.5.x5
[linux-2.6.git] / include / sound / ac97_codec.h
index bcdda71..d421d96 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 #include <linux/bitops.h>
+#include "pcm.h"
 #include "control.h"
 #include "info.h"
 
 #define AC97_BC_20BIT_ADC      0x0200  /* 20-bit ADC resolution */
 #define AC97_BC_ADC_MASK       0x0300
 
+/* general purpose */
+#define AC97_GP_DRSS_MASK      0x0c00  /* double rate slot select */
+#define AC97_GP_DRSS_1011      0x0000  /* LR(C) 10+11(+12) */
+#define AC97_GP_DRSS_78                0x0400  /* LR 7+8 */
+
 /* extended audio ID bit defines */
 #define AC97_EI_VRA            0x0001  /* Variable bit rate supported */
 #define AC97_EI_DRA            0x0002  /* Double rate supported */
 #define AC97_SCAP_SKIP_AUDIO   (1<<4)  /* skip audio part of codec */
 #define AC97_SCAP_SKIP_MODEM   (1<<5)  /* skip modem part of codec */
 #define AC97_SCAP_INDEP_SDIN   (1<<6)  /* independent SDIN */
+#define AC97_SCAP_INV_EAPD     (1<<7)  /* inverted EAPD */
+#define AC97_SCAP_DETECT_BY_VENDOR (1<<8) /* use vendor registers for read tests */
 
 /* ac97->flags */
 #define AC97_HAS_PC_BEEP       (1<<0)  /* force PC Speaker usage */
 #define AC97_CS_SPDIF          (1<<2)  /* Cirrus Logic uses funky SPDIF */
 #define AC97_CX_SPDIF          (1<<3)  /* Conexant's spdif interface */
 #define AC97_STEREO_MUTES      (1<<4)  /* has stereo mute bits */
+#define AC97_DOUBLE_RATE       (1<<5)  /* supports double rate playback */
+#define AC97_HAS_NO_MASTER_VOL (1<<6)  /* no Master volume */
+#define AC97_HAS_NO_PCM_VOL    (1<<7)  /* no PCM volume */
 
 /* rates indexes */
 #define AC97_RATES_FRONT_DAC   0
@@ -369,6 +380,7 @@ enum {
        AC97_SHARED_TYPE_NONE,
        AC97_SHARED_TYPE_ICH,
        AC97_SHARED_TYPE_ATIIXP,
+       AC97_SHARED_TYPE_VIA,
        AC97_SHARED_TYPES
 };
 
@@ -413,6 +425,10 @@ struct snd_ac97_build_ops {
        int (*build_specific) (ac97_t *ac97);
        int (*build_spdif) (ac97_t *ac97);
        int (*build_post_spdif) (ac97_t *ac97);
+#ifdef CONFIG_PM
+       void (*suspend) (ac97_t *ac97);
+       void (*resume) (ac97_t *ac97);
+#endif
 };
 
 struct _snd_ac97_bus_ops {
@@ -432,6 +448,7 @@ struct _snd_ac97_bus {
        snd_card_t *card;
        unsigned short num;     /* bus number */
        unsigned short no_vra: 1, /* bridge doesn't support VRA */
+                      dra: 1,  /* bridge supports double rate */
                       isdin: 1;/* independent SDIN */
        unsigned int clock;     /* AC'97 base clock (usually 48000Hz) */
        spinlock_t bus_lock;    /* used mainly for slot allocation */
@@ -466,8 +483,8 @@ struct _snd_ac97 {
        snd_info_entry_t *proc_regs;
        unsigned short subsystem_vendor;
        unsigned short subsystem_device;
-       spinlock_t reg_lock;
-       struct semaphore mutex; /* mutex for AD18xx multi-codecs and paging (2.3) */
+       struct semaphore reg_mutex;
+       struct semaphore page_mutex;    /* mutex for AD18xx multi-codecs and paging (2.3) */
        unsigned short num;     /* number of codec: 0 = primary, 1 = secondary */
        unsigned short addr;    /* physical address of codec [0-3] */
        unsigned int id;        /* identification of codec */
@@ -518,6 +535,7 @@ static inline int ac97_can_spdif(ac97_t * ac97)
 /* functions */
 int snd_ac97_bus(snd_card_t *card, int num, ac97_bus_ops_t *ops, void *private_data, ac97_bus_t **rbus); /* create new AC97 bus */
 int snd_ac97_mixer(ac97_bus_t *bus, ac97_template_t *template, ac97_t **rac97);        /* create mixer controls */
+const char *snd_ac97_get_short_name(ac97_t *ac97);
 
 void snd_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short value);
 unsigned short snd_ac97_read(ac97_t *ac97, unsigned short reg);
@@ -538,18 +556,21 @@ enum {
        AC97_TUNE_SWAP_SURROUND, /* swap master and surround controls */
        AC97_TUNE_AD_SHARING,   /* for AD1985, turn on OMS bit and use headphone */
        AC97_TUNE_ALC_JACK,     /* for Realtek, enable JACK detection */
+       AC97_TUNE_INV_EAPD,     /* inverted EAPD implementation */
+       AC97_TUNE_MUTE_LED,     /* EAPD bit works as mute LED */
 };
 
 struct ac97_quirk {
        unsigned short vendor;  /* PCI vendor id */
        unsigned short device;  /* PCI device id */
        unsigned short mask;    /* device id bit mask, 0 = accept all */
+       unsigned int codec_id;  /* codec id (if any), 0 = accept all */
        const char *name;       /* name shown as info */
        int type;               /* quirk type above */
 };
 
-int snd_ac97_tune_hardware(ac97_t *ac97, struct ac97_quirk *quirk, int override);
-int snd_ac97_set_rate(ac97_t *ac97, int reg, unsigned short rate);
+int snd_ac97_tune_hardware(ac97_t *ac97, struct ac97_quirk *quirk, const char *override);
+int snd_ac97_set_rate(ac97_t *ac97, int reg, unsigned int rate);
 
 int snd_ac97_pcm_assign(ac97_bus_t *ac97,
                        unsigned short pcms_count,
@@ -557,5 +578,6 @@ int snd_ac97_pcm_assign(ac97_bus_t *ac97,
 int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate,
                      enum ac97_pcm_cfg cfg, unsigned short slots);
 int snd_ac97_pcm_close(struct ac97_pcm *pcm);
+int snd_ac97_pcm_double_rate_rules(snd_pcm_runtime_t *runtime);
 
 #endif /* __SOUND_AC97_CODEC_H */