diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2007-12-23 13:50:57 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-01-31 11:29:44 -0500 |
commit | d0ce9946c52e7bdf95afb09553775cf28b752254 (patch) | |
tree | 684edc99cfd1def12b87abb5431c6b8f0ea2f716 /sound/pci/oxygen/oxygen.h | |
parent | a9b3aa8a0a203b9b62e15c465ba7d4797a6a2c79 (diff) |
[ALSA] add CMI8788 driver
Add the snd-oxygen driver for the C-Media CMI8788 (Oxygen) chip, used on
the Asound A-8788, AuzenTech X-Meridian, Bgears b-Enspirer,
Club3D Theatron DTS, HT-Omega Claro, Razer Barracuda AC-1,
Sondigo Inferno, and TempoTec HIFIER sound cards.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/oxygen/oxygen.h')
-rw-r--r-- | sound/pci/oxygen/oxygen.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h new file mode 100644 index 000000000000..248f7ed22fda --- /dev/null +++ b/sound/pci/oxygen/oxygen.h | |||
@@ -0,0 +1,167 @@ | |||
1 | #ifndef OXYGEN_H_INCLUDED | ||
2 | #define OXYGEN_H_INCLUDED | ||
3 | |||
4 | #include <linux/mutex.h> | ||
5 | #include <linux/spinlock.h> | ||
6 | #include <linux/workqueue.h> | ||
7 | #include "oxygen_regs.h" | ||
8 | |||
9 | /* 1 << PCM_x == OXYGEN_CHANNEL_x */ | ||
10 | #define PCM_A 0 | ||
11 | #define PCM_B 1 | ||
12 | #define PCM_C 2 | ||
13 | #define PCM_SPDIF 3 | ||
14 | #define PCM_MULTICH 4 | ||
15 | #define PCM_AC97 5 | ||
16 | #define PCM_COUNT 6 | ||
17 | |||
18 | #define OXYGEN_PCI_SUBID(sv, sd) \ | ||
19 | .vendor = PCI_VENDOR_ID_CMEDIA, \ | ||
20 | .device = 0x8788, \ | ||
21 | .subvendor = sv, \ | ||
22 | .subdevice = sd | ||
23 | |||
24 | struct pci_dev; | ||
25 | struct snd_card; | ||
26 | struct snd_pcm_substream; | ||
27 | struct snd_pcm_hw_params; | ||
28 | struct snd_rawmidi; | ||
29 | struct oxygen_model; | ||
30 | |||
31 | struct oxygen { | ||
32 | unsigned long addr; | ||
33 | spinlock_t reg_lock; | ||
34 | struct mutex mutex; | ||
35 | struct snd_card *card; | ||
36 | struct pci_dev *pci; | ||
37 | struct snd_rawmidi *midi; | ||
38 | int irq; | ||
39 | const struct oxygen_model *model; | ||
40 | unsigned int interrupt_mask; | ||
41 | u8 dac_volume[8]; | ||
42 | u8 dac_mute; | ||
43 | u8 pcm_active; | ||
44 | u8 pcm_running; | ||
45 | u8 dac_routing; | ||
46 | u8 spdif_playback_enable; | ||
47 | u8 ak4396_reg1; | ||
48 | u8 revision; | ||
49 | u8 has_2nd_ac97_codec; | ||
50 | u32 spdif_bits; | ||
51 | u32 spdif_pcm_bits; | ||
52 | struct snd_pcm_substream *streams[PCM_COUNT]; | ||
53 | struct snd_kcontrol *spdif_pcm_ctl; | ||
54 | struct snd_kcontrol *spdif_input_bits_ctl; | ||
55 | struct work_struct spdif_input_bits_work; | ||
56 | }; | ||
57 | |||
58 | struct oxygen_model { | ||
59 | const char *shortname; | ||
60 | const char *longname; | ||
61 | const char *chip; | ||
62 | struct module *owner; | ||
63 | void (*init)(struct oxygen *chip); | ||
64 | int (*mixer_init)(struct oxygen *chip); | ||
65 | void (*cleanup)(struct oxygen *chip); | ||
66 | void (*set_dac_params)(struct oxygen *chip, | ||
67 | struct snd_pcm_hw_params *params); | ||
68 | void (*set_adc_params)(struct oxygen *chip, | ||
69 | struct snd_pcm_hw_params *params); | ||
70 | void (*update_dac_volume)(struct oxygen *chip); | ||
71 | void (*update_dac_mute)(struct oxygen *chip); | ||
72 | const unsigned int *dac_tlv; | ||
73 | u8 record_from_dma_b; | ||
74 | u8 cd_in_from_video_in; | ||
75 | u8 dac_minimum_volume; | ||
76 | }; | ||
77 | |||
78 | /* oxygen_lib.c */ | ||
79 | |||
80 | int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | ||
81 | const struct oxygen_model *model); | ||
82 | void oxygen_pci_remove(struct pci_dev *pci); | ||
83 | |||
84 | /* oxygen_mixer.c */ | ||
85 | |||
86 | int oxygen_mixer_init(struct oxygen *chip); | ||
87 | void oxygen_update_dac_routing(struct oxygen *chip); | ||
88 | void oxygen_update_spdif_source(struct oxygen *chip); | ||
89 | |||
90 | /* oxygen_pcm.c */ | ||
91 | |||
92 | int oxygen_pcm_init(struct oxygen *chip); | ||
93 | |||
94 | /* oxygen_io.c */ | ||
95 | |||
96 | u8 oxygen_read8(struct oxygen *chip, unsigned int reg); | ||
97 | u16 oxygen_read16(struct oxygen *chip, unsigned int reg); | ||
98 | u32 oxygen_read32(struct oxygen *chip, unsigned int reg); | ||
99 | void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value); | ||
100 | void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value); | ||
101 | void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value); | ||
102 | void oxygen_write8_masked(struct oxygen *chip, unsigned int reg, | ||
103 | u8 value, u8 mask); | ||
104 | void oxygen_write16_masked(struct oxygen *chip, unsigned int reg, | ||
105 | u16 value, u16 mask); | ||
106 | void oxygen_write32_masked(struct oxygen *chip, unsigned int reg, | ||
107 | u32 value, u32 mask); | ||
108 | |||
109 | u16 oxygen_read_ac97(struct oxygen *chip, unsigned int codec, | ||
110 | unsigned int index); | ||
111 | void oxygen_write_ac97(struct oxygen *chip, unsigned int codec, | ||
112 | unsigned int index, u16 data); | ||
113 | void oxygen_write_ac97_masked(struct oxygen *chip, unsigned int codec, | ||
114 | unsigned int index, u16 data, u16 mask); | ||
115 | |||
116 | void oxygen_write_spi(struct oxygen *chip, u8 control, unsigned int data); | ||
117 | |||
118 | static inline void oxygen_set_bits8(struct oxygen *chip, | ||
119 | unsigned int reg, u8 value) | ||
120 | { | ||
121 | oxygen_write8_masked(chip, reg, value, value); | ||
122 | } | ||
123 | |||
124 | static inline void oxygen_set_bits16(struct oxygen *chip, | ||
125 | unsigned int reg, u16 value) | ||
126 | { | ||
127 | oxygen_write16_masked(chip, reg, value, value); | ||
128 | } | ||
129 | |||
130 | static inline void oxygen_set_bits32(struct oxygen *chip, | ||
131 | unsigned int reg, u32 value) | ||
132 | { | ||
133 | oxygen_write32_masked(chip, reg, value, value); | ||
134 | } | ||
135 | |||
136 | static inline void oxygen_clear_bits8(struct oxygen *chip, | ||
137 | unsigned int reg, u8 value) | ||
138 | { | ||
139 | oxygen_write8_masked(chip, reg, 0, value); | ||
140 | } | ||
141 | |||
142 | static inline void oxygen_clear_bits16(struct oxygen *chip, | ||
143 | unsigned int reg, u16 value) | ||
144 | { | ||
145 | oxygen_write16_masked(chip, reg, 0, value); | ||
146 | } | ||
147 | |||
148 | static inline void oxygen_clear_bits32(struct oxygen *chip, | ||
149 | unsigned int reg, u32 value) | ||
150 | { | ||
151 | oxygen_write32_masked(chip, reg, 0, value); | ||
152 | } | ||
153 | |||
154 | static inline void oxygen_ac97_set_bits(struct oxygen *chip, unsigned int codec, | ||
155 | unsigned int index, u16 value) | ||
156 | { | ||
157 | oxygen_write_ac97_masked(chip, codec, index, value, value); | ||
158 | } | ||
159 | |||
160 | static inline void oxygen_ac97_clear_bits(struct oxygen *chip, | ||
161 | unsigned int codec, | ||
162 | unsigned int index, u16 value) | ||
163 | { | ||
164 | oxygen_write_ac97_masked(chip, codec, index, 0, value); | ||
165 | } | ||
166 | |||
167 | #endif | ||