Changeset 84 for GPL/trunk/alsa-kernel/pci/emu10k1/emu10k1.c
- Timestamp:
- Oct 23, 2006, 11:07:11 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk/alsa-kernel/pci/emu10k1/emu10k1.c
r34 r84 2 2 * The driver for the EMU10K1 (SB Live!) based soundcards 3 3 * Copyright (c) by Jaroslav Kysela <perex@suse.cz> 4 * 5 * Copyright (c) by James Courtier-Dutton <James@superbug.demon.co.uk> 6 * Added support for Audigy 2 Value. 4 7 * 5 8 * … … 17 20 * along with this program; if not, write to the Free Software 18 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 * 19 23 * 20 24 */ … … 121 125 static int dev; 122 126 #endif 123 snd_card_t*card;127 struct snd_card *card; 124 128 struct snd_emu10k1 *emu; 125 129 #ifdef ENABLE_SYNTH 126 snd_seq_device_t*wave = NULL;130 struct snd_seq_device *wave = NULL; 127 131 #endif 128 132 int err; … … 145 149 (long)max_buffer_size[dev] * 1024 * 1024, 146 150 enable_ir[dev], subsystem[dev], 147 &emu)) < 0) { 148 snd_card_free(card); 149 return err; 150 } 151 if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0) { 152 snd_card_free(card); 153 return err; 154 } 155 if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0) { 156 snd_card_free(card); 157 return err; 158 } 159 if ((err = snd_emu10k1_pcm_efx(emu, 2, NULL)) < 0) { 160 snd_card_free(card); 161 return err; 162 } 151 &emu)) < 0) 152 goto error; 153 card->private_data = emu; 154 if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0) 155 goto error; 156 if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0) 157 goto error; 158 if ((err = snd_emu10k1_pcm_efx(emu, 2, NULL)) < 0) 159 goto error; 163 160 /* This stores the periods table. */ 164 161 if (emu->card_capabilities->ca0151_chip) { /* P16V */ 165 if(snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), 1024, &emu->p16v_buffer) < 0) { 166 snd_p16v_free(emu); 167 return -ENOMEM; 168 } 162 if ((err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), 163 1024, &emu->p16v_buffer)) < 0) 164 goto error; 169 165 } 170 if ((err = snd_emu10k1_mixer(emu, 0, 3)) < 0) { 171 snd_card_free(card); 172 return err; 166 167 if ((err = snd_emu10k1_mixer(emu, 0, 3)) < 0) 168 goto error; 169 170 if ((err = snd_emu10k1_timer(emu, 0)) < 0) 171 goto error; 172 173 if ((err = snd_emu10k1_pcm_multi(emu, 3, NULL)) < 0) 174 goto error; 175 if (emu->card_capabilities->ca0151_chip) { /* P16V */ 176 if ((err = snd_p16v_pcm(emu, 4, NULL)) < 0) 177 goto error; 173 178 } 174 175 if ((err = snd_emu10k1_timer(emu, 0)) < 0) { 176 snd_card_free(card); 177 return err; 179 if (emu->audigy) { 180 if ((err = snd_emu10k1_audigy_midi(emu)) < 0) 181 goto error; 182 } else { 183 if ((err = snd_emu10k1_midi(emu)) < 0) 184 goto error; 178 185 } 179 180 if ((err = snd_emu10k1_pcm_multi(emu, 3, NULL)) < 0) { 181 snd_card_free(card); 182 return err; 183 } 184 185 if (emu->card_capabilities->ca0151_chip) { /* P16V */ 186 if ((err = snd_p16v_pcm(emu, 4, NULL)) < 0) { 187 snd_card_free(card); 188 return err; 189 } 190 } 191 #ifdef TARGET_OS2 192 if (emu->audigy) { 193 if ((err = snd_emu10k1_audigy_midi(emu)) < 0) { 194 snd_card_free(card); 195 return err; 196 } 197 } else { 198 if ((err = snd_emu10k1_midi(emu)) < 0) { 199 snd_card_free(card); 200 return err; 201 } 202 } 203 #endif 204 if ((err = snd_emu10k1_fx8010_new(emu, 0, NULL)) < 0) { 205 snd_card_free(card); 206 return err; 207 } 186 if ((err = snd_emu10k1_fx8010_new(emu, 0, NULL)) < 0) 187 goto error; 208 188 #ifdef ENABLE_SYNTH 209 189 if (snd_seq_device_new(card, 1, SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH, … … 224 204 strcpy(card->driver, emu->card_capabilities->driver); 225 205 strcpy(card->shortname, emu->card_capabilities->name); 226 sprintf(card->longname, "%s (rev.%d) at 0x%lx, irq %i", card->shortname, emu->revision, emu->port, emu->irq); 227 228 // DebugInt3(); 229 230 if ((err = snd_card_register(card)) < 0) { 231 snd_card_free(card); 232 return err; 233 } 206 sprintf(card->longname, 207 "%s (rev.%d, serial:0x%x) at 0x%lx, irq %i", 208 card->shortname, emu->revision, emu->serial, emu->port, emu->irq); 209 210 if ((err = snd_card_register(card)) < 0) 211 goto error; 212 234 213 pci_set_drvdata(pci, card); 235 214 dev++; 236 return 0; 215 return 0; 216 217 error: 218 snd_card_free(card); 219 return err; 237 220 } 238 221 … … 243 226 } 244 227 245 #ifdef TARGET_OS2 228 #ifdef CONFIG_PM 229 static int snd_emu10k1_suspend(struct pci_dev *pci, pm_message_t state) 230 { 231 struct snd_card *card = pci_get_drvdata(pci); 232 struct snd_emu10k1 *emu = card->private_data; 233 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); 234 235 snd_pcm_suspend_all(emu->pcm); 236 snd_pcm_suspend_all(emu->pcm_mic); 237 snd_pcm_suspend_all(emu->pcm_efx); 238 snd_pcm_suspend_all(emu->pcm_multi); 239 snd_pcm_suspend_all(emu->pcm_p16v); 240 241 snd_ac97_suspend(emu->ac97); 242 243 snd_emu10k1_efx_suspend(emu); 244 snd_emu10k1_suspend_regs(emu); 245 if (emu->card_capabilities->ca0151_chip) 246 snd_p16v_suspend(emu); 247 248 snd_emu10k1_done(emu); 249 250 pci_disable_device(pci); 251 pci_save_state(pci); 252 pci_set_power_state(pci, PCI_D3hot); 253 return 0; 254 } 255 256 static int snd_emu10k1_resume(struct pci_dev *pci) 257 { 258 struct snd_card *card = pci_get_drvdata(pci); 259 struct snd_emu10k1 *emu = card->private_data; 260 261 pci_set_power_state(pci, PCI_D0); 262 pci_restore_state(pci); 263 if (pci_enable_device(pci) < 0) { 264 printk(KERN_ERR "emu10k1: pci_enable_device failed, " 265 "disabling device\n"); 266 snd_card_disconnect(card); 267 return -EIO; 268 } 269 270 pci_set_master(pci); 271 272 snd_emu10k1_resume_init(emu); 273 snd_emu10k1_efx_resume(emu); 274 snd_ac97_resume(emu->ac97); 275 snd_emu10k1_resume_regs(emu); 276 277 if (emu->card_capabilities->ca0151_chip) 278 snd_p16v_resume(emu); 279 snd_power_change_state(card, SNDRV_CTL_POWER_D0); 280 return 0; 281 } 282 #endif 283 246 284 static struct pci_driver driver = { 247 0, 0, 0, 248 /* name: */ "EMU10K1/Audigy", 249 /* id_table:*/ snd_emu10k1_ids, 250 /* probe: */ snd_card_emu10k1_probe, 251 /* remove: */ snd_card_emu10k1_remove, 252 0, 0 285 .name = "EMU10K1_Audigy", 286 .id_table = snd_emu10k1_ids, 287 .probe = snd_card_emu10k1_probe, 288 .remove = snd_card_emu10k1_remove, 289 #ifdef CONFIG_PM 290 .suspend = snd_emu10k1_suspend, 291 .resume = snd_emu10k1_resume, 292 #endif 253 293 }; 254 #else255 static struct pci_driver driver = {256 name: "EMU10K1/Audigy",257 id_table: snd_emu10k1_ids,258 probe: snd_card_emu10k1_probe,259 remove: __devexit_p(snd_card_emu10k1_remove),260 };261 #endif262 294 263 295 static int __init alsa_card_emu10k1_init(void) 264 296 { 265 int err; 266 267 if ((err = pci_module_init(&driver)) < 0) { 268 #ifdef MODULE 269 // printk(KERN_ERR "EMU10K1/Audigy soundcard not found or device busy\n"); 270 #endif 271 return err; 272 } 273 return 0; 297 return pci_register_driver(&driver); 274 298 } 275 299 276 300 static void __exit alsa_card_emu10k1_exit(void) 277 301 { 278 302 pci_unregister_driver(&driver); 279 303 } 280 304 281 305 module_init(alsa_card_emu10k1_init) 282 306 module_exit(alsa_card_emu10k1_exit) 283 284 #ifndef MODULE285 286 /* format is: snd-emu10k1=enable,index,id,287 seq_ports,max_synth_voices */288 289 static int __init alsa_card_emu10k1_setup(char *str)290 {291 static unsigned __initdata nr_dev = 0;292 293 if (nr_dev >= SNDRV_CARDS)294 return 0;295 (void)(get_option(&str,&enable[nr_dev]) == 2 &&296 get_option(&str,&index[nr_dev]) == 2 &&297 get_id(&str,&id[nr_dev]) == 2 &&298 get_option(&str,&seq_ports[nr_dev]) == 2 &&299 get_option(&str,&max_synth_voices[nr_dev]) == 2);300 nr_dev++;301 return 1;302 }303 304 __setup("snd-emu10k1=", alsa_card_emu10k1_setup);305 306 #endif /* ifndef MODULE */
Note:
See TracChangeset
for help on using the changeset viewer.