Blame view

sound/pci/oxygen/oxygen.h 7.36 KB
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
1
2
3
4
5
  #ifndef OXYGEN_H_INCLUDED
  #define OXYGEN_H_INCLUDED
  
  #include <linux/mutex.h>
  #include <linux/spinlock.h>
1e821dd27   Clemens Ladisch   [ALSA] oxygen: us...
6
  #include <linux/wait.h>
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
7
8
9
10
11
12
13
14
15
16
17
  #include <linux/workqueue.h>
  #include "oxygen_regs.h"
  
  /* 1 << PCM_x == OXYGEN_CHANNEL_x */
  #define PCM_A		0
  #define PCM_B		1
  #define PCM_C		2
  #define PCM_SPDIF	3
  #define PCM_MULTICH	4
  #define PCM_AC97	5
  #define PCM_COUNT	6
5b8bf2a54   Clemens Ladisch   ALSA: oxygen: sim...
18
19
20
  #define OXYGEN_MCLKS(f_single, f_double, f_quad) ((MCLK_##f_single << 0) | \
  						  (MCLK_##f_double << 2) | \
  						  (MCLK_##f_quad   << 4))
c13650079   Clemens Ladisch   [ALSA] oxygen: ad...
21
  #define OXYGEN_IO_SIZE	0x100
1275d6f60   Clemens Ladisch   sound: oxygen: au...
22
  #define OXYGEN_EEPROM_ID	0x434d	/* "CM" */
f009ad9b3   Clemens Ladisch   [ALSA] oxygen: ch...
23
  /* model-specific configuration of outputs/inputs */
dbbbd6744   Clemens Ladisch   ALSA: oxygen: con...
24
25
26
27
28
29
30
31
32
33
34
35
36
  #define PLAYBACK_0_TO_I2S	0x0001
       /* PLAYBACK_0_TO_AC97_0		not implemented */
  #define PLAYBACK_1_TO_SPDIF	0x0004
  #define PLAYBACK_2_TO_AC97_1	0x0008
  #define CAPTURE_0_FROM_I2S_1	0x0010
  #define CAPTURE_0_FROM_I2S_2	0x0020
       /* CAPTURE_0_FROM_AC97_0		not implemented */
  #define CAPTURE_1_FROM_SPDIF	0x0080
  #define CAPTURE_2_FROM_I2S_2	0x0100
  #define CAPTURE_2_FROM_AC97_1	0x0200
       /* CAPTURE_3_FROM_I2S_3		not implemented */
  #define MIDI_OUTPUT		0x0800
  #define MIDI_INPUT		0x1000
b6ca8ab39   Clemens Ladisch   ALSA: oxygen: han...
37
  #define AC97_CD_INPUT		0x2000
e96f38f73   Clemens Ladisch   ALSA: virtuoso: f...
38
  #define AC97_FMIC_SWITCH	0x4000
f009ad9b3   Clemens Ladisch   [ALSA] oxygen: ch...
39

01a3affb2   Clemens Ladisch   [ALSA] oxygen: us...
40
41
42
  enum {
  	CONTROL_SPDIF_PCM,
  	CONTROL_SPDIF_INPUT_BITS,
893e44ba5   Clemens Ladisch   [ALSA] oxygen: ma...
43
44
45
46
  	CONTROL_MIC_CAPTURE_SWITCH,
  	CONTROL_LINE_CAPTURE_SWITCH,
  	CONTROL_CD_CAPTURE_SWITCH,
  	CONTROL_AUX_CAPTURE_SWITCH,
01a3affb2   Clemens Ladisch   [ALSA] oxygen: us...
47
48
  	CONTROL_COUNT
  };
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
49
50
51
52
53
  #define OXYGEN_PCI_SUBID(sv, sd) \
  	.vendor = PCI_VENDOR_ID_CMEDIA, \
  	.device = 0x8788, \
  	.subvendor = sv, \
  	.subdevice = sd
30459d7b1   Clemens Ladisch   sound: oxygen: ha...
54
55
56
57
  #define BROKEN_EEPROM_DRIVER_DATA ((unsigned long)-1)
  #define OXYGEN_PCI_SUBID_BROKEN_EEPROM \
  	OXYGEN_PCI_SUBID(PCI_VENDOR_ID_CMEDIA, 0x8788), \
  	.driver_data = BROKEN_EEPROM_DRIVER_DATA
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
58
  struct pci_dev;
30459d7b1   Clemens Ladisch   sound: oxygen: ha...
59
  struct pci_device_id;
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
60
61
  struct snd_card;
  struct snd_pcm_substream;
747c6016c   Clemens Ladisch   [ALSA] oxygen: ma...
62
  struct snd_pcm_hardware;
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
63
  struct snd_pcm_hw_params;
ccc80fb46   Clemens Ladisch   [ALSA] oxygen: ad...
64
  struct snd_kcontrol_new;
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
65
  struct snd_rawmidi;
9719fcaa6   Clemens Ladisch   ALSA: oxygen: all...
66
  struct snd_info_buffer;
9bd6a73ae   Clemens Ladisch   ALSA: oxygen: use...
67
  struct oxygen;
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
68
69
70
71
72
  
  struct oxygen_model {
  	const char *shortname;
  	const char *longname;
  	const char *chip;
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
73
  	void (*init)(struct oxygen *chip);
ccc80fb46   Clemens Ladisch   [ALSA] oxygen: ad...
74
  	int (*control_filter)(struct snd_kcontrol_new *template);
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
75
76
  	int (*mixer_init)(struct oxygen *chip);
  	void (*cleanup)(struct oxygen *chip);
4a4bc53bc   Clemens Ladisch   [ALSA] oxygen: ad...
77
78
  	void (*suspend)(struct oxygen *chip);
  	void (*resume)(struct oxygen *chip);
747c6016c   Clemens Ladisch   [ALSA] oxygen: ma...
79
80
  	void (*pcm_hardware_filter)(unsigned int channel,
  				    struct snd_pcm_hardware *hardware);
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
81
82
83
84
85
86
  	void (*set_dac_params)(struct oxygen *chip,
  			       struct snd_pcm_hw_params *params);
  	void (*set_adc_params)(struct oxygen *chip,
  			       struct snd_pcm_hw_params *params);
  	void (*update_dac_volume)(struct oxygen *chip);
  	void (*update_dac_mute)(struct oxygen *chip);
3d8bb454c   Clemens Ladisch   sound: oxygen: ad...
87
  	void (*update_center_lfe_mix)(struct oxygen *chip, bool mixed);
efbeb0718   Clemens Ladisch   ALSA: oxygen: fix...
88
89
  	unsigned int (*adjust_dac_routing)(struct oxygen *chip,
  					   unsigned int play_routing);
7c0141591   Clemens Ladisch   [ALSA] virtuoso: ...
90
  	void (*gpio_changed)(struct oxygen *chip);
397b1dcc4   Clemens Ladisch   ALSA: oxygen: add...
91
  	void (*uart_input)(struct oxygen *chip);
11864b4b8   Clemens Ladisch   [ALSA] virtuoso: ...
92
93
  	void (*ac97_switch)(struct oxygen *chip,
  			    unsigned int reg, unsigned int mute);
9719fcaa6   Clemens Ladisch   ALSA: oxygen: all...
94
95
  	void (*dump_registers)(struct oxygen *chip,
  			       struct snd_info_buffer *buffer);
4972a177f   Clemens Ladisch   [ALSA] oxygen: ge...
96
  	const unsigned int *dac_tlv;
7ef37cd95   Clemens Ladisch   [ALSA] oxygen: mo...
97
  	size_t model_data_size;
d76596b1e   Clemens Ladisch   ALSA: oxygen: ren...
98
  	unsigned int device_config;
1f4d7be72   Clemens Ladisch   ALSA: oxygen: all...
99
100
  	u8 dac_channels_pcm;
  	u8 dac_channels_mixer;
193e81381   Clemens Ladisch   [ALSA] oxygen: ge...
101
102
  	u8 dac_volume_min;
  	u8 dac_volume_max;
db12b8e30   Clemens Ladisch   [ALSA] oxygen: mo...
103
  	u8 misc_flags;
84aa6b7ba   Clemens Ladisch   [ALSA] oxygen: ma...
104
  	u8 function_flags;
5b8bf2a54   Clemens Ladisch   ALSA: oxygen: sim...
105
106
  	u8 dac_mclks;
  	u8 adc_mclks;
05855ba3f   Clemens Ladisch   [ALSA] oxygen: ma...
107
108
  	u16 dac_i2s_format;
  	u16 adc_i2s_format;
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
109
  };
9bd6a73ae   Clemens Ladisch   ALSA: oxygen: use...
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  struct oxygen {
  	unsigned long addr;
  	spinlock_t reg_lock;
  	struct mutex mutex;
  	struct snd_card *card;
  	struct pci_dev *pci;
  	struct snd_rawmidi *midi;
  	int irq;
  	void *model_data;
  	unsigned int interrupt_mask;
  	u8 dac_volume[8];
  	u8 dac_mute;
  	u8 pcm_active;
  	u8 pcm_running;
  	u8 dac_routing;
  	u8 spdif_playback_enable;
9bd6a73ae   Clemens Ladisch   ALSA: oxygen: use...
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  	u8 has_ac97_0;
  	u8 has_ac97_1;
  	u32 spdif_bits;
  	u32 spdif_pcm_bits;
  	struct snd_pcm_substream *streams[PCM_COUNT];
  	struct snd_kcontrol *controls[CONTROL_COUNT];
  	struct work_struct spdif_input_bits_work;
  	struct work_struct gpio_work;
  	wait_queue_head_t ac97_waitqueue;
  	union {
  		u8 _8[OXYGEN_IO_SIZE];
  		__le16 _16[OXYGEN_IO_SIZE / 2];
  		__le32 _32[OXYGEN_IO_SIZE / 4];
  	} saved_registers;
  	u16 saved_ac97_registers[2][0x40];
397b1dcc4   Clemens Ladisch   ALSA: oxygen: add...
141
142
  	unsigned int uart_input_count;
  	u8 uart_input[32];
9bd6a73ae   Clemens Ladisch   ALSA: oxygen: use...
143
144
  	struct oxygen_model model;
  };
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
145
  /* oxygen_lib.c */
db12b8e30   Clemens Ladisch   [ALSA] oxygen: mo...
146
  int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
bb7185885   Clemens Ladisch   sound: oxygen: ma...
147
  		     struct module *owner,
30459d7b1   Clemens Ladisch   sound: oxygen: ha...
148
149
150
151
152
  		     const struct pci_device_id *ids,
  		     int (*get_model)(struct oxygen *chip,
  				      const struct pci_device_id *id
  				     )
  		    );
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
153
  void oxygen_pci_remove(struct pci_dev *pci);
4a4bc53bc   Clemens Ladisch   [ALSA] oxygen: ad...
154
155
156
157
  #ifdef CONFIG_PM
  int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state);
  int oxygen_pci_resume(struct pci_dev *pci);
  #endif
4c25b9322   Clemens Ladisch   ALSA: virtuoso: w...
158
  void oxygen_pci_shutdown(struct pci_dev *pci);
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  
  /* oxygen_mixer.c */
  
  int oxygen_mixer_init(struct oxygen *chip);
  void oxygen_update_dac_routing(struct oxygen *chip);
  void oxygen_update_spdif_source(struct oxygen *chip);
  
  /* oxygen_pcm.c */
  
  int oxygen_pcm_init(struct oxygen *chip);
  
  /* oxygen_io.c */
  
  u8 oxygen_read8(struct oxygen *chip, unsigned int reg);
  u16 oxygen_read16(struct oxygen *chip, unsigned int reg);
  u32 oxygen_read32(struct oxygen *chip, unsigned int reg);
  void oxygen_write8(struct oxygen *chip, unsigned int reg, u8 value);
  void oxygen_write16(struct oxygen *chip, unsigned int reg, u16 value);
  void oxygen_write32(struct oxygen *chip, unsigned int reg, u32 value);
  void oxygen_write8_masked(struct oxygen *chip, unsigned int reg,
  			  u8 value, u8 mask);
  void oxygen_write16_masked(struct oxygen *chip, unsigned int reg,
  			   u16 value, u16 mask);
  void oxygen_write32_masked(struct oxygen *chip, unsigned int reg,
  			   u32 value, u32 mask);
  
  u16 oxygen_read_ac97(struct oxygen *chip, unsigned int codec,
  		     unsigned int index);
  void oxygen_write_ac97(struct oxygen *chip, unsigned int codec,
  		       unsigned int index, u16 data);
  void oxygen_write_ac97_masked(struct oxygen *chip, unsigned int codec,
  			      unsigned int index, u16 data, u16 mask);
  
  void oxygen_write_spi(struct oxygen *chip, u8 control, unsigned int data);
10e6d5f9b   Clemens Ladisch   [ALSA] oxygen: ad...
193
  void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data);
d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
194

397b1dcc4   Clemens Ladisch   ALSA: oxygen: add...
195
196
  void oxygen_reset_uart(struct oxygen *chip);
  void oxygen_write_uart(struct oxygen *chip, u8 data);
30459d7b1   Clemens Ladisch   sound: oxygen: ha...
197
  u16 oxygen_read_eeprom(struct oxygen *chip, unsigned int index);
1275d6f60   Clemens Ladisch   sound: oxygen: au...
198
  void oxygen_write_eeprom(struct oxygen *chip, unsigned int index, u16 value);
30459d7b1   Clemens Ladisch   sound: oxygen: ha...
199

d0ce9946c   Clemens Ladisch   [ALSA] add CMI878...
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  static inline void oxygen_set_bits8(struct oxygen *chip,
  				    unsigned int reg, u8 value)
  {
  	oxygen_write8_masked(chip, reg, value, value);
  }
  
  static inline void oxygen_set_bits16(struct oxygen *chip,
  				     unsigned int reg, u16 value)
  {
  	oxygen_write16_masked(chip, reg, value, value);
  }
  
  static inline void oxygen_set_bits32(struct oxygen *chip,
  				     unsigned int reg, u32 value)
  {
  	oxygen_write32_masked(chip, reg, value, value);
  }
  
  static inline void oxygen_clear_bits8(struct oxygen *chip,
  				      unsigned int reg, u8 value)
  {
  	oxygen_write8_masked(chip, reg, 0, value);
  }
  
  static inline void oxygen_clear_bits16(struct oxygen *chip,
  				       unsigned int reg, u16 value)
  {
  	oxygen_write16_masked(chip, reg, 0, value);
  }
  
  static inline void oxygen_clear_bits32(struct oxygen *chip,
  				       unsigned int reg, u32 value)
  {
  	oxygen_write32_masked(chip, reg, 0, value);
  }
  
  static inline void oxygen_ac97_set_bits(struct oxygen *chip, unsigned int codec,
  					unsigned int index, u16 value)
  {
  	oxygen_write_ac97_masked(chip, codec, index, value, value);
  }
  
  static inline void oxygen_ac97_clear_bits(struct oxygen *chip,
  					  unsigned int codec,
  					  unsigned int index, u16 value)
  {
  	oxygen_write_ac97_masked(chip, codec, index, 0, value);
  }
  
  #endif