diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2008-01-16 02:28:17 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-01-31 11:29:59 -0500 |
commit | 31c77643a06313b3a26f4c38c75ceec2a89ad31a (patch) | |
tree | b38b6be831ebf4ebd20df512b1544938a3cbd224 /sound/pci/oxygen/oxygen_lib.c | |
parent | 12b74c80cc20dec27b9f9eeb24ee86170c34e5a1 (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.c | 82 |
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 | ||
232 | static void oxygen_card_free(struct snd_card *card) | 250 | static void oxygen_card_free(struct snd_card *card) |