aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/oxygen/oxygen_lib.c
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2008-01-16 02:28:17 -0500
committerJaroslav Kysela <perex@perex.cz>2008-01-31 11:29:59 -0500
commit31c77643a06313b3a26f4c38c75ceec2a89ad31a (patch)
treeb38b6be831ebf4ebd20df512b1544938a3cbd224 /sound/pci/oxygen/oxygen_lib.c
parent12b74c80cc20dec27b9f9eeb24ee86170c34e5a1 (diff)
[ALSA] oxygen: make AC97 codec optional
Only initialize and create mixer controls for the first AC97 codec when one has actually been detected. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/oxygen/oxygen_lib.c')
-rw-r--r--sound/pci/oxygen/oxygen_lib.c82
1 files changed, 50 insertions, 32 deletions
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c
index 5b77c9439c36..ba2bb4995d1e 100644
--- a/sound/pci/oxygen/oxygen_lib.c
+++ b/sound/pci/oxygen/oxygen_lib.c
@@ -142,13 +142,25 @@ static void oxygen_proc_read(struct snd_info_entry *entry,
142 } 142 }
143 if (mutex_lock_interruptible(&chip->mutex) < 0) 143 if (mutex_lock_interruptible(&chip->mutex) < 0)
144 return; 144 return;
145 snd_iprintf(buffer, "\nAC97\n"); 145 if (chip->has_ac97_0) {
146 for (i = 0; i < 0x80; i += 0x10) { 146 snd_iprintf(buffer, "\nAC97\n");
147 snd_iprintf(buffer, "%02x:", i); 147 for (i = 0; i < 0x80; i += 0x10) {
148 for (j = 0; j < 0x10; j += 2) 148 snd_iprintf(buffer, "%02x:", i);
149 snd_iprintf(buffer, " %04x", 149 for (j = 0; j < 0x10; j += 2)
150 oxygen_read_ac97(chip, 0, i + j)); 150 snd_iprintf(buffer, " %04x",
151 snd_iprintf(buffer, "\n"); 151 oxygen_read_ac97(chip, 0, i + j));
152 snd_iprintf(buffer, "\n");
153 }
154 }
155 if (chip->has_ac97_1) {
156 snd_iprintf(buffer, "\nAC97 2\n");
157 for (i = 0; i < 0x80; i += 0x10) {
158 snd_iprintf(buffer, "%02x:", i);
159 for (j = 0; j < 0x10; j += 2)
160 snd_iprintf(buffer, " %04x",
161 oxygen_read_ac97(chip, 1, i + j));
162 snd_iprintf(buffer, "\n");
163 }
152 } 164 }
153 mutex_unlock(&chip->mutex); 165 mutex_unlock(&chip->mutex);
154} 166}
@@ -184,6 +196,10 @@ static void __devinit oxygen_init(struct oxygen *chip)
184 if (chip->revision == 1) 196 if (chip->revision == 1)
185 oxygen_set_bits8(chip, OXYGEN_MISC, OXYGEN_MISC_MAGIC); 197 oxygen_set_bits8(chip, OXYGEN_MISC, OXYGEN_MISC_MAGIC);
186 198
199 i = oxygen_read16(chip, OXYGEN_AC97_CONTROL);
200 chip->has_ac97_0 = (i & OXYGEN_AC97_CODEC_0) != 0;
201 chip->has_ac97_1 = (i & OXYGEN_AC97_CODEC_1) != 0;
202
187 oxygen_set_bits8(chip, OXYGEN_FUNCTION, 203 oxygen_set_bits8(chip, OXYGEN_FUNCTION,
188 OXYGEN_FUNCTION_RESET_CODEC | 204 OXYGEN_FUNCTION_RESET_CODEC |
189 OXYGEN_FUNCTION_ENABLE_SPI_4_5); 205 OXYGEN_FUNCTION_ENABLE_SPI_4_5);
@@ -202,31 +218,33 @@ static void __devinit oxygen_init(struct oxygen *chip)
202 oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); 218 oxygen_write16(chip, OXYGEN_DMA_STATUS, 0);
203 219
204 oxygen_write8(chip, OXYGEN_AC97_INTERRUPT_MASK, 0x00); 220 oxygen_write8(chip, OXYGEN_AC97_INTERRUPT_MASK, 0x00);
205 oxygen_clear_bits16(chip, OXYGEN_AC97_OUT_CONFIG, 221 if (chip->has_ac97_0) {
206 OXYGEN_AC97_OUT_MAGIC3); 222 oxygen_clear_bits16(chip, OXYGEN_AC97_OUT_CONFIG,
207 oxygen_set_bits16(chip, OXYGEN_AC97_IN_CONFIG, 223 OXYGEN_AC97_OUT_MAGIC3);
208 OXYGEN_AC97_IN_MAGIC3); 224 oxygen_set_bits16(chip, OXYGEN_AC97_IN_CONFIG,
209 oxygen_write_ac97(chip, 0, AC97_RESET, 0); 225 OXYGEN_AC97_IN_MAGIC3);
210 msleep(1); 226 oxygen_write_ac97(chip, 0, AC97_RESET, 0);
211 oxygen_ac97_set_bits(chip, 0, 0x70, 0x0300); 227 msleep(1);
212 oxygen_ac97_set_bits(chip, 0, 0x64, 0x8043); 228 oxygen_ac97_set_bits(chip, 0, 0x70, 0x0300);
213 oxygen_ac97_set_bits(chip, 0, 0x62, 0x180f); 229 oxygen_ac97_set_bits(chip, 0, 0x64, 0x8043);
214 oxygen_write_ac97(chip, 0, AC97_MASTER, 0x0000); 230 oxygen_ac97_set_bits(chip, 0, 0x62, 0x180f);
215 oxygen_write_ac97(chip, 0, AC97_PC_BEEP, 0x8000); 231 oxygen_write_ac97(chip, 0, AC97_MASTER, 0x0000);
216 oxygen_write_ac97(chip, 0, AC97_MIC, 0x8808); 232 oxygen_write_ac97(chip, 0, AC97_PC_BEEP, 0x8000);
217 oxygen_write_ac97(chip, 0, AC97_LINE, 0x0808); 233 oxygen_write_ac97(chip, 0, AC97_MIC, 0x8808);
218 oxygen_write_ac97(chip, 0, AC97_CD, 0x8808); 234 oxygen_write_ac97(chip, 0, AC97_LINE, 0x0808);
219 oxygen_write_ac97(chip, 0, AC97_VIDEO, 0x8808); 235 oxygen_write_ac97(chip, 0, AC97_CD, 0x8808);
220 oxygen_write_ac97(chip, 0, AC97_AUX, 0x8808); 236 oxygen_write_ac97(chip, 0, AC97_VIDEO, 0x8808);
221 oxygen_write_ac97(chip, 0, AC97_REC_GAIN, 0x8000); 237 oxygen_write_ac97(chip, 0, AC97_AUX, 0x8808);
222 oxygen_write_ac97(chip, 0, AC97_CENTER_LFE_MASTER, 0x8080); 238 oxygen_write_ac97(chip, 0, AC97_REC_GAIN, 0x8000);
223 oxygen_write_ac97(chip, 0, AC97_SURROUND_MASTER, 0x8080); 239 oxygen_write_ac97(chip, 0, AC97_CENTER_LFE_MASTER, 0x8080);
224 oxygen_ac97_clear_bits(chip, 0, 0x72, 0x0001); 240 oxygen_write_ac97(chip, 0, AC97_SURROUND_MASTER, 0x8080);
225 /* power down unused ADCs and DACs */ 241 oxygen_ac97_clear_bits(chip, 0, 0x72, 0x0001);
226 oxygen_ac97_set_bits(chip, 0, AC97_POWERDOWN, 242 /* power down unused ADCs and DACs */
227 AC97_PD_PR0 | AC97_PD_PR1); 243 oxygen_ac97_set_bits(chip, 0, AC97_POWERDOWN,
228 oxygen_ac97_set_bits(chip, 0, AC97_EXTENDED_STATUS, 244 AC97_PD_PR0 | AC97_PD_PR1);
229 AC97_EA_PRI | AC97_EA_PRJ | AC97_EA_PRK); 245 oxygen_ac97_set_bits(chip, 0, AC97_EXTENDED_STATUS,
246 AC97_EA_PRI | AC97_EA_PRJ | AC97_EA_PRK);
247 }
230} 248}
231 249
232static void oxygen_card_free(struct snd_card *card) 250static void oxygen_card_free(struct snd_card *card)