diff options
Diffstat (limited to 'sound/core/hwdep.c')
| -rw-r--r-- | sound/core/hwdep.c | 53 | 
1 files changed, 38 insertions, 15 deletions
diff --git a/sound/core/hwdep.c b/sound/core/hwdep.c index d105073298c..69459e5f712 100644 --- a/sound/core/hwdep.c +++ b/sound/core/hwdep.c @@ -375,7 +375,7 @@ int snd_hwdep_new(struct snd_card *card, char *id, int device,  		*rhwdep = NULL;  	hwdep = kzalloc(sizeof(*hwdep), GFP_KERNEL);  	if (hwdep == NULL) { -		snd_printk(KERN_ERR "hwdep: cannot allocate\n"); +		dev_err(card->dev, "hwdep: cannot allocate\n");  		return -ENOMEM;  	}  	hwdep->card = card; @@ -395,6 +395,7 @@ int snd_hwdep_new(struct snd_card *card, char *id, int device,  		*rhwdep = hwdep;  	return 0;  } +EXPORT_SYMBOL(snd_hwdep_new);  static int snd_hwdep_free(struct snd_hwdep *hwdep)  { @@ -415,37 +416,61 @@ static int snd_hwdep_dev_free(struct snd_device *device)  static int snd_hwdep_dev_register(struct snd_device *device)  {  	struct snd_hwdep *hwdep = device->device_data; +	struct snd_card *card = hwdep->card; +	struct device *dev;  	int err;  	char name[32];  	mutex_lock(®ister_mutex); -	if (snd_hwdep_search(hwdep->card, hwdep->device)) { +	if (snd_hwdep_search(card, hwdep->device)) {  		mutex_unlock(®ister_mutex);  		return -EBUSY;  	}  	list_add_tail(&hwdep->list, &snd_hwdep_devices);  	sprintf(name, "hwC%iD%i", hwdep->card->number, hwdep->device); -	if ((err = snd_register_device(SNDRV_DEVICE_TYPE_HWDEP, -				       hwdep->card, hwdep->device, -				       &snd_hwdep_f_ops, hwdep, name)) < 0) { -		snd_printk(KERN_ERR "unable to register hardware dependent device %i:%i\n", -			   hwdep->card->number, hwdep->device); +	dev = hwdep->dev; +	if (!dev) +		dev = snd_card_get_device_link(hwdep->card); +	err = snd_register_device_for_dev(SNDRV_DEVICE_TYPE_HWDEP, +					  hwdep->card, hwdep->device, +					  &snd_hwdep_f_ops, hwdep, name, dev); +	if (err < 0) { +		dev_err(dev, +			"unable to register hardware dependent device %i:%i\n", +			card->number, hwdep->device);  		list_del(&hwdep->list);  		mutex_unlock(®ister_mutex);  		return err;  	} + +	if (hwdep->groups) { +		struct device *d = snd_get_device(SNDRV_DEVICE_TYPE_HWDEP, +						  hwdep->card, hwdep->device); +		if (d) { +			if (hwdep->private_data) +				dev_set_drvdata(d, hwdep->private_data); +			err = sysfs_create_groups(&d->kobj, hwdep->groups); +			if (err < 0) +				dev_warn(dev, +					 "hwdep %d:%d: cannot create sysfs groups\n", +					 card->number, hwdep->device); +			put_device(d); +		} +	} +  #ifdef CONFIG_SND_OSSEMUL  	hwdep->ossreg = 0;  	if (hwdep->oss_type >= 0) {  		if ((hwdep->oss_type == SNDRV_OSS_DEVICE_TYPE_DMFM) && (hwdep->device != 0)) { -			snd_printk (KERN_WARNING "only hwdep device 0 can be registered as OSS direct FM device!\n"); +			dev_warn(dev, +				 "only hwdep device 0 can be registered as OSS direct FM device!\n");  		} else {  			if (snd_register_oss_device(hwdep->oss_type, -						    hwdep->card, hwdep->device, -						    &snd_hwdep_f_ops, hwdep, -						    hwdep->oss_dev) < 0) { -				snd_printk(KERN_ERR "unable to register OSS compatibility device %i:%i\n", -					   hwdep->card->number, hwdep->device); +						    card, hwdep->device, +						    &snd_hwdep_f_ops, hwdep) < 0) { +				dev_err(dev, +					"unable to register OSS compatibility device %i:%i\n", +					card->number, hwdep->device);  			} else  				hwdep->ossreg = 1;  		} @@ -543,5 +568,3 @@ static void __exit alsa_hwdep_exit(void)  module_init(alsa_hwdep_init)  module_exit(alsa_hwdep_exit) - -EXPORT_SYMBOL(snd_hwdep_new);  | 
