void attach_awacs( struct address_info *hw_config ) { int audio_flags = 0; int format_mask = AFMT_S16_LE; awacs_devc_t *devc; struct audio_driver *driver = &awacs_audio_driver; #if 0 printk( "attach_awacs() - %s %d\n\r", __FILE__, __LINE__ ); #endif devc = (awacs_devc_t *) vmalloc( sizeof(awacs_devc_t) ); memset( devc, 0, sizeof(awacs_devc_t) ); if ((devc->dev = sound_install_audiodrv (AUDIO_DRIVER_VERSION, hw_config->name, driver, sizeof (struct audio_driver), audio_flags, format_mask, devc, -1, -1)) < 0) { printk( "sound_install_audiodrv - rc = %d - %s %d\n\r", devc->dev, __FILE__, __LINE__ ); return; } if ( (devc->mixer_dev = sound_install_mixer( MIXER_DRIVER_VERSION, hw_config->name, (struct mixer_operations *)&awacs_mixer_driver, sizeof(struct mixer_operations), devc)) < 0 ) { printk( "sound_install_mixer - rc = %d - %s %d\n\r", devc->dev, __FILE__, __LINE__ ); return; } awacs_devs[awacs_num_devs].dev = devc->dev; awacs_devs[awacs_num_devs].mixer = devc->mixer_dev; awacs_devs[awacs_num_devs].devc = devc; awacs_num_devs++; devc->audio_bits = 16; devc->audio_channels = 2; devc->audio_speed = 22050; memset( devc->mach_dev_name, sizeof(devc->mach_dev_name), 0 ); strcpy( devc->mach_dev_name, hw_config->name ); return; }
static int __init nm256_install(struct pci_dev *pcidev, enum nm256rev rev, char *verstr) { struct nm256_info *card; struct pm_dev *pmdev; int x; card = kmalloc (sizeof (struct nm256_info), GFP_KERNEL); if (card == NULL) { printk (KERN_ERR "NM256: out of memory!\n"); return 0; } card->magsig = NM_MAGIC_SIG; card->playing = 0; card->recording = 0; card->rev = rev; /* Init the memory port info. */ for (x = 0; x < 2; x++) { card->port[x].physaddr = RSRCADDRESS (pcidev, x); card->port[x].ptr = NULL; card->port[x].start_offset = 0; card->port[x].end_offset = 0; } /* Port 2 is easy. */ card->port[1].start_offset = 0; card->port[1].end_offset = NM_PORT2_SIZE; /* Yuck. But we have to map in port 2 so we can check how much RAM the card has. */ if (nm256_remap_ports (card)) { kfree (card); return 0; } /* * The NM256 has two memory ports. The first port is nothing * more than a chunk of video RAM, which is used as the I/O ring * buffer. The second port has the actual juicy stuff (like the * mixer and the playback engine control registers). */ if (card->rev == REV_NM256AV) { /* Ok, try to see if this is a non-AC97 version of the hardware. */ int pval = nm256_readPort16 (card, 2, NM_MIXER_PRESENCE); if ((pval & NM_PRESENCE_MASK) != NM_PRESENCE_VALUE) { if (! force_load) { printk (KERN_ERR "NM256: This doesn't look to me like the AC97-compatible version.\n"); printk (KERN_ERR " You can force the driver to load by passing in the module\n"); printk (KERN_ERR " parameter:\n"); printk (KERN_ERR " force_ac97 = 1\n"); printk (KERN_ERR "\n"); printk (KERN_ERR " More likely, you should be using the appropriate SB-16 or\n"); printk (KERN_ERR " CS4232 driver instead. (If your BIOS has settings for\n"); printk (KERN_ERR " IRQ and/or DMA for the sound card, this is *not* the correct\n"); printk (KERN_ERR " driver to use.)\n"); nm256_release_ports (card); kfree (card); return 0; } else { printk (KERN_INFO "NM256: Forcing driver load as per user request.\n"); } } else { /* printk (KERN_INFO "NM256: Congratulations. You're not running Eunice.\n")*/; } card->port[0].end_offset = 2560 * 1024; card->introutine = nm256_interrupt; card->mixer_status_offset = NM_MIXER_STATUS_OFFSET; card->mixer_status_mask = NM_MIXER_READY_MASK; } else { /* Not sure if there is any relevant detect for the ZX or not. */ if (nm256_readPort8 (card, 2, 0xa0b) != 0) card->port[0].end_offset = 6144 * 1024; else card->port[0].end_offset = 4096 * 1024; card->introutine = nm256_interrupt_zx; card->mixer_status_offset = NM2_MIXER_STATUS_OFFSET; card->mixer_status_mask = NM2_MIXER_READY_MASK; } if (buffertop >= 98304 && buffertop < card->port[0].end_offset) card->port[0].end_offset = buffertop; else nm256_peek_for_sig (card); card->port[0].start_offset = card->port[0].end_offset - 98304; printk (KERN_INFO "NM256: Mapping port 1 from 0x%x - 0x%x\n", card->port[0].start_offset, card->port[0].end_offset); if (nm256_remap_ports (card)) { kfree (card); return 0; } /* See if we can get the interrupt. */ card->irq = pcidev->irq; card->has_irq = 0; if (nm256_grabInterrupt (card) != 0) { nm256_release_ports (card); kfree (card); return 0; } nm256_releaseInterrupt (card); /* * Init the board. */ card->playbackBufferSize = 16384; card->recordBufferSize = 16384; card->coeffBuf = card->port[0].end_offset - NM_MAX_COEFFICIENT; card->abuf2 = card->coeffBuf - card->recordBufferSize; card->abuf1 = card->abuf2 - card->playbackBufferSize; card->allCoeffBuf = card->abuf2 - (NM_TOTAL_COEFF_COUNT * 4); /* Fixed setting. */ card->mixer = NM_MIXER_OFFSET; card->mixer_values_init = 0; card->is_open_play = 0; card->is_open_record = 0; card->coeffsCurrent = 0; card->opencnt[0] = 0; card->opencnt[1] = 0; /* Reasonable default settings, but largely unnecessary. */ for (x = 0; x < 2; x++) { card->sinfo[x].bits = 8; card->sinfo[x].stereo = 0; card->sinfo[x].samplerate = 8000; } nm256_initHw (card); for (x = 0; x < 2; x++) { if ((card->dev[x] = sound_install_audiodrv(AUDIO_DRIVER_VERSION, "NM256", &nm256_audio_driver, sizeof(struct audio_driver), DMA_NODMA, AFMT_U8 | AFMT_S16_LE, NULL, -1, -1)) >= 0) { /* 1K minimum buffer size. */ audio_devs[card->dev[x]]->min_fragment = 10; /* Maximum of 8K buffer size. */ audio_devs[card->dev[x]]->max_fragment = 13; } else { printk(KERN_ERR "NM256: Too many PCM devices available\n"); nm256_release_ports (card); kfree (card); return 0; } } /* Insert the card in the list. */ card->next_card = nmcard_list; nmcard_list = card; printk(KERN_INFO "Initialized NeoMagic %s audio in PCI native mode\n", verstr); /* * And our mixer. (We should allow support for other mixers, maybe.) */ nm256_install_mixer (card); pmdev = pm_register(PM_PCI_DEV, PM_PCI_ID(pcidev), handle_pm_event); if (pmdev) pmdev->data = card; return 1; }