diff options
Diffstat (limited to 'sound/core/sound.c')
| -rw-r--r-- | sound/core/sound.c | 51 | 
1 files changed, 22 insertions, 29 deletions
diff --git a/sound/core/sound.c b/sound/core/sound.c index f002bd911da..38ad1a0dd3f 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c @@ -118,7 +118,7 @@ void *snd_lookup_minor_data(unsigned int minor, int type)  	if (mreg && mreg->type == type) {  		private_data = mreg->private_data;  		if (private_data && mreg->card_ptr) -			atomic_inc(&mreg->card_ptr->refcount); +			get_device(&mreg->card_ptr->card_dev);  	} else  		private_data = NULL;  	mutex_unlock(&sound_mutex); @@ -153,7 +153,7 @@ static int snd_open(struct inode *inode, struct file *file)  {  	unsigned int minor = iminor(inode);  	struct snd_minor *mptr = NULL; -	const struct file_operations *old_fops; +	const struct file_operations *new_fops;  	int err = 0;  	if (minor >= ARRAY_SIZE(snd_minors)) @@ -167,24 +167,14 @@ static int snd_open(struct inode *inode, struct file *file)  			return -ENODEV;  		}  	} -	old_fops = file->f_op; -	file->f_op = fops_get(mptr->f_ops); -	if (file->f_op == NULL) { -		file->f_op = old_fops; -		err = -ENODEV; -	} +	new_fops = fops_get(mptr->f_ops);  	mutex_unlock(&sound_mutex); -	if (err < 0) -		return err; +	if (!new_fops) +		return -ENODEV; +	replace_fops(file, new_fops); -	if (file->f_op->open) { +	if (file->f_op->open)  		err = file->f_op->open(inode, file); -		if (err) { -			fops_put(file->f_op); -			file->f_op = fops_get(old_fops); -		} -	} -	fops_put(old_fops);  	return err;  } @@ -365,22 +355,25 @@ int snd_unregister_device(int type, struct snd_card *card, int dev)  EXPORT_SYMBOL(snd_unregister_device); -int snd_add_device_sysfs_file(int type, struct snd_card *card, int dev, -			      struct device_attribute *attr) +/* get the assigned device to the given type and device number; + * the caller needs to release it via put_device() after using it + */ +struct device *snd_get_device(int type, struct snd_card *card, int dev)  { -	int minor, ret = -EINVAL; -	struct device *d; +	int minor; +	struct device *d = NULL;  	mutex_lock(&sound_mutex);  	minor = find_snd_minor(type, card, dev); -	if (minor >= 0 && (d = snd_minors[minor]->dev) != NULL) -		ret = device_create_file(d, attr); +	if (minor >= 0) { +		d = snd_minors[minor]->dev; +		if (d) +			get_device(d); +	}  	mutex_unlock(&sound_mutex); -	return ret; - +	return d;  } - -EXPORT_SYMBOL(snd_add_device_sysfs_file); +EXPORT_SYMBOL(snd_get_device);  #ifdef CONFIG_PROC_FS  /* @@ -468,7 +461,7 @@ static int __init alsa_sound_init(void)  	snd_major = major;  	snd_ecards_limit = cards_limit;  	if (register_chrdev(major, "alsa", &snd_fops)) { -		snd_printk(KERN_ERR "unable to register native major device number %d\n", major); +		pr_err("ALSA core: unable to register native major device number %d\n", major);  		return -EIO;  	}  	if (snd_info_init() < 0) { @@ -477,7 +470,7 @@ static int __init alsa_sound_init(void)  	}  	snd_info_minor_register();  #ifndef MODULE -	printk(KERN_INFO "Advanced Linux Sound Architecture Driver Initialized.\n"); +	pr_info("Advanced Linux Sound Architecture Driver Initialized.\n");  #endif  	return 0;  }  | 
