static int sound_open(struct inode *inode, struct file *file) { int dev = MINOR(inode->i_rdev); int retval; DEB(printk("sound_open(dev=%d)\n", dev)); if ((dev >= SND_NDEVS) || (dev < 0)) { printk(KERN_ERR "Invalid minor device %d\n", dev); return -ENXIO; } switch (dev & 0x0f) { case SND_DEV_CTL: dev >>= 4; if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) { char modname[20]; sprintf(modname, "mixer%d", dev); request_module(modname); } if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL)) return -ENXIO; if (mixer_devs[dev]->owner) __MOD_INC_USE_COUNT (mixer_devs[dev]->owner); break; case SND_DEV_SEQ: case SND_DEV_SEQ2: if ((retval = sequencer_open(dev, file)) < 0) return retval; break; case SND_DEV_MIDIN: if ((retval = MIDIbuf_open(dev, file)) < 0) return retval; break; case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: if ((retval = audio_open(dev, file)) < 0) return retval; break; default: printk(KERN_ERR "Invalid minor device %d\n", dev); return -ENXIO; } return 0; }
static int sound_open(struct inode *inode, struct file *file) { int dev = iminor(inode); int retval; DEB(printk("sound_open(dev=%d)\n", dev)); if ((dev >= SND_NDEVS) || (dev < 0)) { printk(KERN_ERR "Invalid minor device %d\n", dev); return -ENXIO; } mutex_lock(&soundcard_mutex); switch (dev & 0x0f) { case SND_DEV_CTL: dev >>= 4; if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) { request_module("mixer%d", dev); } retval = -ENXIO; if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL)) break; if (!try_module_get(mixer_devs[dev]->owner)) break; retval = 0; break; case SND_DEV_SEQ: case SND_DEV_SEQ2: retval = sequencer_open(dev, file); break; case SND_DEV_MIDIN: retval = MIDIbuf_open(dev, file); break; case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: retval = audio_open(dev, file); break; default: printk(KERN_ERR "Invalid minor device %d\n", dev); retval = -ENXIO; } mutex_unlock(&soundcard_mutex); return retval; }
static int sound_open(struct inode *inode, struct file *file) { int dev, retval; if (is_unloading) { /* printk(KERN_ERR "Sound: Driver partially removed. Can't open device\n");*/ return -EBUSY; } dev = MINOR(inode->i_rdev); if (!soundcard_configured && dev != SND_DEV_CTL && dev != SND_DEV_STATUS) { /* printk("SoundCard Error: The sound system has not been configured\n");*/ return -ENXIO; } DEB(printk("sound_open(dev=%d)\n", dev)); if ((dev >= SND_NDEVS) || (dev < 0)) { /* printk(KERN_ERR "Invalid minor device %d\n", dev);*/ return -ENXIO; } switch (dev & 0x0f) { case SND_DEV_STATUS: break; case SND_DEV_CTL: dev >>= 4; if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) { char modname[20]; sprintf(modname, "mixer%d", dev); request_module(modname); } if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL)) return -ENXIO; break; #ifdef CONFIG_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: if ((retval = sequencer_open(dev, file)) < 0) return retval; break; #endif #ifdef CONFIG_MIDI case SND_DEV_MIDIN: if ((retval = MIDIbuf_open(dev, file)) < 0) return retval; break; #endif #ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: if ((retval = audio_open(dev, file)) < 0) return retval; break; #endif default: printk(KERN_ERR "Invalid minor device %d\n", dev); return -ENXIO; } in_use++; #ifdef CONFIG_MODULES notifier_call_chain(&sound_locker, 1, 0); lock_depth++; #endif return 0; }