Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
oxygen.h
Go to the documentation of this file.
1 #ifndef OXYGEN_H_INCLUDED
2 #define OXYGEN_H_INCLUDED
3 
4 #include <linux/mutex.h>
5 #include <linux/spinlock.h>
6 #include <linux/wait.h>
7 #include <linux/workqueue.h>
8 #include "oxygen_regs.h"
9 
10 /* 1 << PCM_x == OXYGEN_CHANNEL_x */
11 #define PCM_A 0
12 #define PCM_B 1
13 #define PCM_C 2
14 #define PCM_SPDIF 3
15 #define PCM_MULTICH 4
16 #define PCM_AC97 5
17 #define PCM_COUNT 6
18 
19 #define OXYGEN_MCLKS(f_single, f_double, f_quad) ((MCLK_##f_single << 0) | \
20  (MCLK_##f_double << 2) | \
21  (MCLK_##f_quad << 4))
22 
23 #define OXYGEN_IO_SIZE 0x100
24 
25 #define OXYGEN_EEPROM_ID 0x434d /* "CM" */
26 
27 /* model-specific configuration of outputs/inputs */
28 #define PLAYBACK_0_TO_I2S 0x0001
29  /* PLAYBACK_0_TO_AC97_0 not implemented */
30 #define PLAYBACK_1_TO_SPDIF 0x0004
31 #define PLAYBACK_2_TO_AC97_1 0x0008
32 #define CAPTURE_0_FROM_I2S_1 0x0010
33 #define CAPTURE_0_FROM_I2S_2 0x0020
34  /* CAPTURE_0_FROM_AC97_0 not implemented */
35 #define CAPTURE_1_FROM_SPDIF 0x0080
36 #define CAPTURE_2_FROM_I2S_2 0x0100
37 #define CAPTURE_2_FROM_AC97_1 0x0200
38  /* CAPTURE_3_FROM_I2S_3 not implemented */
39 #define MIDI_OUTPUT 0x0800
40 #define MIDI_INPUT 0x1000
41 #define AC97_CD_INPUT 0x2000
42 #define AC97_FMIC_SWITCH 0x4000
43 
44 enum {
52 };
53 
54 #define OXYGEN_PCI_SUBID(sv, sd) \
55  .vendor = PCI_VENDOR_ID_CMEDIA, \
56  .device = 0x8788, \
57  .subvendor = sv, \
58  .subdevice = sd
59 
60 #define BROKEN_EEPROM_DRIVER_DATA ((unsigned long)-1)
61 #define OXYGEN_PCI_SUBID_BROKEN_EEPROM \
62  OXYGEN_PCI_SUBID(PCI_VENDOR_ID_CMEDIA, 0x8788), \
63  .driver_data = BROKEN_EEPROM_DRIVER_DATA
64 
65 struct pci_dev;
66 struct pci_device_id;
67 struct snd_card;
68 struct snd_pcm_substream;
69 struct snd_pcm_hardware;
70 struct snd_pcm_hw_params;
71 struct snd_kcontrol_new;
72 struct snd_rawmidi;
73 struct snd_info_buffer;
74 struct oxygen;
75 
76 struct oxygen_model {
77  const char *shortname;
78  const char *longname;
79  const char *chip;
80  void (*init)(struct oxygen *chip);
81  int (*control_filter)(struct snd_kcontrol_new *template);
82  int (*mixer_init)(struct oxygen *chip);
83  void (*cleanup)(struct oxygen *chip);
84  void (*suspend)(struct oxygen *chip);
85  void (*resume)(struct oxygen *chip);
86  void (*pcm_hardware_filter)(unsigned int channel,
87  struct snd_pcm_hardware *hardware);
89  struct snd_pcm_hw_params *params);
91  struct snd_pcm_hw_params *params);
94  void (*update_center_lfe_mix)(struct oxygen *chip, bool mixed);
95  unsigned int (*adjust_dac_routing)(struct oxygen *chip,
96  unsigned int play_routing);
98  void (*uart_input)(struct oxygen *chip);
100  unsigned int reg, unsigned int mute);
102  struct snd_info_buffer *buffer);
103  const unsigned int *dac_tlv;
105  unsigned int device_config;
116 };
117 
118 struct oxygen {
119  unsigned long addr;
121  struct mutex mutex;
122  struct snd_card *card;
123  struct pci_dev *pci;
124  struct snd_rawmidi *midi;
125  int irq;
126  void *model_data;
127  unsigned int interrupt_mask;
128  u8 dac_volume[8];
143  union {
147  } saved_registers;
148  u16 saved_ac97_registers[2][0x40];
149  unsigned int uart_input_count;
150  u8 uart_input[32];
152 };
153 
154 /* oxygen_lib.c */
155 
156 int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
157  struct module *owner,
158  const struct pci_device_id *ids,
159  int (*get_model)(struct oxygen *chip,
160  const struct pci_device_id *id
161  )
162  );
163 void oxygen_pci_remove(struct pci_dev *pci);
164 #ifdef CONFIG_PM_SLEEP
165 extern const struct dev_pm_ops oxygen_pci_pm;
166 #endif
167 void oxygen_pci_shutdown(struct pci_dev *pci);
168 
169 /* oxygen_mixer.c */
170 
171 int oxygen_mixer_init(struct oxygen *chip);
174 
175 /* oxygen_pcm.c */
176 
177 int oxygen_pcm_init(struct oxygen *chip);
178 
179 /* oxygen_io.c */
180 
181 u8 oxygen_read8(struct oxygen *chip, unsigned int reg);
182 u16 oxygen_read16(struct oxygen *chip, unsigned int reg);
183 u32 oxygen_read32(struct oxygen *chip, unsigned int reg);
184 void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value);
185 void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value);
186 void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value);
187 void oxygen_write8_masked(struct oxygen *chip, unsigned int reg,
188  u8 value, u8 mask);
189 void oxygen_write16_masked(struct oxygen *chip, unsigned int reg,
190  u16 value, u16 mask);
191 void oxygen_write32_masked(struct oxygen *chip, unsigned int reg,
192  u32 value, u32 mask);
193 
194 u16 oxygen_read_ac97(struct oxygen *chip, unsigned int codec,
195  unsigned int index);
196 void oxygen_write_ac97(struct oxygen *chip, unsigned int codec,
197  unsigned int index, u16 data);
198 void oxygen_write_ac97_masked(struct oxygen *chip, unsigned int codec,
199  unsigned int index, u16 data, u16 mask);
200 
201 void oxygen_write_spi(struct oxygen *chip, u8 control, unsigned int data);
202 void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data);
203 
204 void oxygen_reset_uart(struct oxygen *chip);
205 void oxygen_write_uart(struct oxygen *chip, u8 data);
206 
207 u16 oxygen_read_eeprom(struct oxygen *chip, unsigned int index);
208 void oxygen_write_eeprom(struct oxygen *chip, unsigned int index, u16 value);
209 
210 static inline void oxygen_set_bits8(struct oxygen *chip,
211  unsigned int reg, u8 value)
212 {
213  oxygen_write8_masked(chip, reg, value, value);
214 }
215 
216 static inline void oxygen_set_bits16(struct oxygen *chip,
217  unsigned int reg, u16 value)
218 {
219  oxygen_write16_masked(chip, reg, value, value);
220 }
221 
222 static inline void oxygen_set_bits32(struct oxygen *chip,
223  unsigned int reg, u32 value)
224 {
225  oxygen_write32_masked(chip, reg, value, value);
226 }
227 
228 static inline void oxygen_clear_bits8(struct oxygen *chip,
229  unsigned int reg, u8 value)
230 {
231  oxygen_write8_masked(chip, reg, 0, value);
232 }
233 
234 static inline void oxygen_clear_bits16(struct oxygen *chip,
235  unsigned int reg, u16 value)
236 {
237  oxygen_write16_masked(chip, reg, 0, value);
238 }
239 
240 static inline void oxygen_clear_bits32(struct oxygen *chip,
241  unsigned int reg, u32 value)
242 {
243  oxygen_write32_masked(chip, reg, 0, value);
244 }
245 
246 static inline void oxygen_ac97_set_bits(struct oxygen *chip, unsigned int codec,
247  unsigned int index, u16 value)
248 {
249  oxygen_write_ac97_masked(chip, codec, index, value, value);
250 }
251 
252 static inline void oxygen_ac97_clear_bits(struct oxygen *chip,
253  unsigned int codec,
254  unsigned int index, u16 value)
255 {
256  oxygen_write_ac97_masked(chip, codec, index, 0, value);
257 }
258 
259 #endif