aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/oxygen/oxygen.h
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2007-12-23 13:50:57 -0500
committerJaroslav Kysela <perex@perex.cz>2008-01-31 11:29:44 -0500
commitd0ce9946c52e7bdf95afb09553775cf28b752254 (patch)
tree684edc99cfd1def12b87abb5431c6b8f0ea2f716 /sound/pci/oxygen/oxygen.h
parenta9b3aa8a0a203b9b62e15c465ba7d4797a6a2c79 (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.h167
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
24struct pci_dev;
25struct snd_card;
26struct snd_pcm_substream;
27struct snd_pcm_hw_params;
28struct snd_rawmidi;
29struct oxygen_model;
30
31struct 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
58struct 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
80int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
81 const struct oxygen_model *model);
82void oxygen_pci_remove(struct pci_dev *pci);
83
84/* oxygen_mixer.c */
85
86int oxygen_mixer_init(struct oxygen *chip);
87void oxygen_update_dac_routing(struct oxygen *chip);
88void oxygen_update_spdif_source(struct oxygen *chip);
89
90/* oxygen_pcm.c */
91
92int oxygen_pcm_init(struct oxygen *chip);
93
94/* oxygen_io.c */
95
96u8 oxygen_read8(struct oxygen *chip, unsigned int reg);
97u16 oxygen_read16(struct oxygen *chip, unsigned int reg);
98u32 oxygen_read32(struct oxygen *chip, unsigned int reg);
99void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value);
100void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value);
101void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value);
102void oxygen_write8_masked(struct oxygen *chip, unsigned int reg,
103 u8 value, u8 mask);
104void oxygen_write16_masked(struct oxygen *chip, unsigned int reg,
105 u16 value, u16 mask);
106void oxygen_write32_masked(struct oxygen *chip, unsigned int reg,
107 u32 value, u32 mask);
108
109u16 oxygen_read_ac97(struct oxygen *chip, unsigned int codec,
110 unsigned int index);
111void oxygen_write_ac97(struct oxygen *chip, unsigned int codec,
112 unsigned int index, u16 data);
113void oxygen_write_ac97_masked(struct oxygen *chip, unsigned int codec,
114 unsigned int index, u16 data, u16 mask);
115
116void oxygen_write_spi(struct oxygen *chip, u8 control, unsigned int data);
117
118static 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
124static 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
130static 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
136static 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
142static 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
148static 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
154static 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
160static 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