static void start_cards() { int drv, i, n = num_sound_cards; struct card_info *ci = snd_installed_cards ; sound_started = 1; if (trace_init) printf("Sound initialization started\n"); /* * Check the number of cards actually defined in the table */ for (i = 0; i < n && snd_installed_cards[i].card_type; i++) num_sound_cards = i + 1; for (i = 0; i < n && ci->card_type; ci++, i++) if (ci->enabled) { if ((drv = snd_find_driver(ci->card_type)) == -1) { ci->enabled = 0; /* Mark as not detected */ continue; } ci->config.card_subtype = sound_drivers[drv].card_subtype; if (sound_drivers[drv].probe(&(ci->config))) sound_drivers[drv].attach(&(ci->config)); else ci->enabled = 0; /* Mark as not detected */ } if (trace_init) printf("Sound initialization complete\n"); }
int sndtable_init_card(int unit, struct address_info * hw_config) { int i, n = num_sound_cards; struct card_info *ci = snd_installed_cards ; DDB(printf("sndtable_init_card(%d) entered\n", unit)); if (!unit) { sndtable_init() ; return TRUE; } for (i = 0; i < n && ci->card_type; ci++, i++) if (ci->card_type == unit) { int drv; ci->config.io_base = hw_config->io_base; ci->config.irq = hw_config->irq; ci->config.dma = hw_config->dma; ci->config.dma2 = hw_config->dma2; ci->config.name = hw_config->name; ci->config.always_detect = hw_config->always_detect; ci->config.card_subtype = hw_config->card_subtype; ci->config.osp = hw_config->osp; if ((drv = snd_find_driver(ci->card_type)) == -1) ci->enabled = 0; /* Mark not fnd */ else { DDB(printf("Located card - calling attach routine\n")); sound_drivers[drv].attach(hw_config) ; DDB(printf("attach routine finished\n")); } start_services(); return TRUE; } DDB(printf("sndtable_init_card: No card defined with type=%d, num cards: %d\n", unit, num_sound_cards)); return FALSE; }
static int sound_proc_get_info(char *buffer, char **start, off_t offset, int length, int inout) { int len, i, drv; off_t pos = 0; off_t begin = 0; #ifdef MODULE #define MODULEPROCSTRING "Driver loaded as a module" #else #define MODULEPROCSTRING "Driver compiled into kernel" #endif down(&uts_sem); len = sprintf(buffer, "OSS/Free:" SOUND_VERSION_STRING "\n" "Load type: " MODULEPROCSTRING "\n" "Kernel: %s %s %s %s %s\n" "Config options: %x\n\nInstalled drivers: \n", system_utsname.sysname, system_utsname.nodename, system_utsname.release, system_utsname.version, system_utsname.machine, SELECTED_SOUND_OPTIONS); up(&uts_sem); for (i = 0; (i < num_sound_drivers) && (pos <= offset + length); i++) { if (!sound_drivers[i].card_type) continue; len += sprintf(buffer + len, "Type %d: %s\n", sound_drivers[i].card_type, sound_drivers[i].name); pos = begin + len; if (pos < offset) { len = 0; begin = pos; } } len += sprintf(buffer + len, "\nCard config: \n"); for (i = 0; (i < num_sound_cards) && (pos <= offset + length); i++) { if (!snd_installed_cards[i].card_type) continue; if (!snd_installed_cards[i].enabled) len += sprintf(buffer + len, "("); if ((drv = snd_find_driver(snd_installed_cards[i].card_type)) != -1) len += sprintf(buffer + len, "%s", sound_drivers[drv].name); if (snd_installed_cards[i].config.io_base) len += sprintf(buffer + len, " at 0x%x", snd_installed_cards[i].config.io_base); if (snd_installed_cards[i].config.irq != 0) len += sprintf(buffer + len, " irq %d", abs(snd_installed_cards[i].config.irq)); if (snd_installed_cards[i].config.dma != -1) { len += sprintf(buffer + len, " drq %d", snd_installed_cards[i].config.dma); if (snd_installed_cards[i].config.dma2 != -1) len += sprintf(buffer + len, ",%d", snd_installed_cards[i].config.dma2); } if (!snd_installed_cards[i].enabled) len += sprintf(buffer + len, ")"); len += sprintf(buffer + len, "\n"); pos = begin + len; if (pos < offset) { len = 0; begin = pos; } } if (!sound_started) len += sprintf(buffer + len, "\n\n***** Sound driver not started *****\n\n"); #ifndef CONFIG_AUDIO len += sprintf(buffer + len, "\nAudio devices: NOT ENABLED IN CONFIG\n"); #else len += sprintf(buffer + len, "\nAudio devices:\n"); for (i = 0; (i < num_audiodevs) && (pos <= offset + length); i++) { if (audio_devs[i] == NULL) continue; len += sprintf(buffer + len, "%d: %s%s\n", i, audio_devs[i]->name, audio_devs[i]->flags & DMA_DUPLEX ? " (DUPLEX)" : ""); pos = begin + len; if (pos < offset) { len = 0; begin = pos; } } #endif #ifndef CONFIG_SEQUENCER len += sprintf(buffer + len, "\nSynth devices: NOT ENABLED IN CONFIG\n"); #else len += sprintf(buffer + len, "\nSynth devices:\n"); for (i = 0; (i < num_synths) && (pos <= offset + length); i++) { if (synth_devs[i] == NULL) continue; len += sprintf(buffer + len, "%d: %s\n", i, synth_devs[i]->info->name); pos = begin + len; if (pos < offset) { len = 0; begin = pos; } } #endif #ifndef CONFIG_MIDI len += sprintf(buffer + len, "\nMidi devices: NOT ENABLED IN CONFIG\n"); #else len += sprintf(buffer + len, "\nMidi devices:\n"); for (i = 0; (i < num_midis) && (pos <= offset + length); i++) { if (midi_devs[i] == NULL) continue; len += sprintf(buffer + len, "%d: %s\n", i, midi_devs[i]->info.name); pos = begin + len; if (pos < offset) { len = 0; begin = pos; } } #endif #ifdef CONFIG_SEQUENCER len += sprintf(buffer + len, "\nTimers:\n"); for (i = 0; (i < num_sound_timers) && (pos <= offset + length); i++) { if (sound_timer_devs[i] == NULL) continue; len += sprintf(buffer + len, "%d: %s\n", i, sound_timer_devs[i]->info.name); pos = begin + len; if (pos < offset) { len = 0; begin = pos; } } #endif len += sprintf(buffer + len, "\nMixers:\n"); for (i = 0; (i < num_mixers) && (pos <= offset + length); i++) { if (mixer_devs[i] == NULL) continue; len += sprintf(buffer + len, "%d: %s\n", i, mixer_devs[i]->name); pos = begin + len; if (pos < offset) { len = 0; begin = pos; } } *start = buffer + (offset - begin); len -= (offset - begin); if (len > length) len = length; return len; }
int sndtable_probe(int unit, struct address_info * hw_config) { int i, sel = -1, n = num_sound_cards; struct card_info *ci = snd_installed_cards ; DDB(printf("-- sndtable_probe(%d)\n", unit)); /* * for some reason unit 0 always succeeds ? */ if (!unit) return TRUE; sound_started = 1; for (i=0; i<n && sel== -1 && ci->card_type; ci++, i++) if ( (ci->enabled) && (ci->card_type == unit) ) { /* DDB(printf("-- found card %d\n", i) ); */ sel = i; /* and break */ } /* * not found. Creates a new entry in the table for this unit. */ if (sel == -1 && num_sound_cards < max_sound_cards) { int i; i = sel = (num_sound_cards++); DDB(printf("-- installing card %d\n", i) ); ci = &snd_installed_cards[sel] ; ci->card_type = unit; ci->enabled = 1; } /* DDB(printf("-- installed card %d\n", sel) ); */ if (sel != -1) { int drv; ci->config.io_base = hw_config->io_base; ci->config.irq = hw_config->irq; ci->config.dma = hw_config->dma; ci->config.dma2 = hw_config->dma2; ci->config.name = hw_config->name; ci->config.always_detect = hw_config->always_detect; ci->config.card_subtype = hw_config->card_subtype; ci->config.osp = hw_config->osp; if ((drv = snd_find_driver(ci->card_type)) == -1) { ci->enabled = 0; DDB(printf("Failed to find driver\n")); return FALSE; } DDB(printf("-- Driver name '%s' probe 0x%08x\n", sound_drivers[drv].name, sound_drivers[drv].probe)); hw_config->card_subtype = ci->config.card_subtype = sound_drivers[drv].card_subtype; if (sound_drivers[drv].probe(hw_config)) { DDB(printf("-- Hardware probed OK\n")); return TRUE; } DDB(printf("-- Failed to find hardware\n")); ci->enabled = 0; /* mark as not detected */ return FALSE; } return FALSE; }