1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   *  Initialization routines
4   *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
5   */
6  
7  #include <linux/init.h>
8  #include <linux/sched.h>
9  #include <linux/module.h>
10  #include <linux/device.h>
11  #include <linux/file.h>
12  #include <linux/slab.h>
13  #include <linux/time.h>
14  #include <linux/ctype.h>
15  #include <linux/pm.h>
16  #include <linux/debugfs.h>
17  #include <linux/completion.h>
18  #include <linux/interrupt.h>
19  
20  #include <sound/core.h>
21  #include <sound/control.h>
22  #include <sound/info.h>
23  
24  /* monitor files for graceful shutdown (hotplug) */
25  struct snd_monitor_file {
26  	struct file *file;
27  	const struct file_operations *disconnected_f_op;
28  	struct list_head shutdown_list;	/* still need to shutdown */
29  	struct list_head list;	/* link of monitor files */
30  };
31  
32  static DEFINE_SPINLOCK(shutdown_lock);
33  static LIST_HEAD(shutdown_files);
34  
35  static const struct file_operations snd_shutdown_f_ops;
36  
37  /* locked for registering/using */
38  static DECLARE_BITMAP(snd_cards_lock, SNDRV_CARDS);
39  static struct snd_card *snd_cards[SNDRV_CARDS];
40  
41  static DEFINE_MUTEX(snd_card_mutex);
42  
43  static char *slots[SNDRV_CARDS];
44  module_param_array(slots, charp, NULL, 0444);
45  MODULE_PARM_DESC(slots, "Module names assigned to the slots.");
46  
47  /* return non-zero if the given index is reserved for the given
48   * module via slots option
49   */
module_slot_match(struct module * module,int idx)50  static int module_slot_match(struct module *module, int idx)
51  {
52  	int match = 1;
53  #ifdef CONFIG_MODULES
54  	const char *s1, *s2;
55  
56  	if (!module || !*module->name || !slots[idx])
57  		return 0;
58  
59  	s1 = module->name;
60  	s2 = slots[idx];
61  	if (*s2 == '!') {
62  		match = 0; /* negative match */
63  		s2++;
64  	}
65  	/* compare module name strings
66  	 * hyphens are handled as equivalent with underscore
67  	 */
68  	for (;;) {
69  		char c1 = *s1++;
70  		char c2 = *s2++;
71  		if (c1 == '-')
72  			c1 = '_';
73  		if (c2 == '-')
74  			c2 = '_';
75  		if (c1 != c2)
76  			return !match;
77  		if (!c1)
78  			break;
79  	}
80  #endif /* CONFIG_MODULES */
81  	return match;
82  }
83  
84  #if IS_ENABLED(CONFIG_SND_MIXER_OSS)
85  int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
86  EXPORT_SYMBOL(snd_mixer_oss_notify_callback);
87  #endif
88  
check_empty_slot(struct module * module,int slot)89  static int check_empty_slot(struct module *module, int slot)
90  {
91  	return !slots[slot] || !*slots[slot];
92  }
93  
94  /* return an empty slot number (>= 0) found in the given bitmask @mask.
95   * @mask == -1 == 0xffffffff means: take any free slot up to 32
96   * when no slot is available, return the original @mask as is.
97   */
get_slot_from_bitmask(int mask,int (* check)(struct module *,int),struct module * module)98  static int get_slot_from_bitmask(int mask, int (*check)(struct module *, int),
99  				 struct module *module)
100  {
101  	int slot;
102  
103  	for (slot = 0; slot < SNDRV_CARDS; slot++) {
104  		if (slot < 32 && !(mask & (1U << slot)))
105  			continue;
106  		if (!test_bit(slot, snd_cards_lock)) {
107  			if (check(module, slot))
108  				return slot; /* found */
109  		}
110  	}
111  	return mask; /* unchanged */
112  }
113  
114  /* the default release callback set in snd_device_alloc() */
default_release_alloc(struct device * dev)115  static void default_release_alloc(struct device *dev)
116  {
117  	kfree(dev);
118  }
119  
120  /**
121   * snd_device_alloc - Allocate and initialize struct device for sound devices
122   * @dev_p: pointer to store the allocated device
123   * @card: card to assign, optional
124   *
125   * For releasing the allocated device, call put_device().
126   */
snd_device_alloc(struct device ** dev_p,struct snd_card * card)127  int snd_device_alloc(struct device **dev_p, struct snd_card *card)
128  {
129  	struct device *dev;
130  
131  	*dev_p = NULL;
132  	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
133  	if (!dev)
134  		return -ENOMEM;
135  	device_initialize(dev);
136  	if (card)
137  		dev->parent = &card->card_dev;
138  	dev->class = &sound_class;
139  	dev->release = default_release_alloc;
140  	*dev_p = dev;
141  	return 0;
142  }
143  EXPORT_SYMBOL_GPL(snd_device_alloc);
144  
145  static int snd_card_init(struct snd_card *card, struct device *parent,
146  			 int idx, const char *xid, struct module *module,
147  			 size_t extra_size);
148  static int snd_card_do_free(struct snd_card *card);
149  static const struct attribute_group card_dev_attr_group;
150  
release_card_device(struct device * dev)151  static void release_card_device(struct device *dev)
152  {
153  	snd_card_do_free(dev_to_snd_card(dev));
154  }
155  
156  /**
157   *  snd_card_new - create and initialize a soundcard structure
158   *  @parent: the parent device object
159   *  @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
160   *  @xid: card identification (ASCII string)
161   *  @module: top level module for locking
162   *  @extra_size: allocate this extra size after the main soundcard structure
163   *  @card_ret: the pointer to store the created card instance
164   *
165   *  The function allocates snd_card instance via kzalloc with the given
166   *  space for the driver to use freely.  The allocated struct is stored
167   *  in the given card_ret pointer.
168   *
169   *  Return: Zero if successful or a negative error code.
170   */
snd_card_new(struct device * parent,int idx,const char * xid,struct module * module,int extra_size,struct snd_card ** card_ret)171  int snd_card_new(struct device *parent, int idx, const char *xid,
172  		    struct module *module, int extra_size,
173  		    struct snd_card **card_ret)
174  {
175  	struct snd_card *card;
176  	int err;
177  
178  	if (snd_BUG_ON(!card_ret))
179  		return -EINVAL;
180  	*card_ret = NULL;
181  
182  	if (extra_size < 0)
183  		extra_size = 0;
184  	card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL);
185  	if (!card)
186  		return -ENOMEM;
187  
188  	err = snd_card_init(card, parent, idx, xid, module, extra_size);
189  	if (err < 0)
190  		return err; /* card is freed by error handler */
191  
192  	*card_ret = card;
193  	return 0;
194  }
195  EXPORT_SYMBOL(snd_card_new);
196  
__snd_card_release(struct device * dev,void * data)197  static void __snd_card_release(struct device *dev, void *data)
198  {
199  	snd_card_free(data);
200  }
201  
202  /**
203   * snd_devm_card_new - managed snd_card object creation
204   * @parent: the parent device object
205   * @idx: card index (address) [0 ... (SNDRV_CARDS-1)]
206   * @xid: card identification (ASCII string)
207   * @module: top level module for locking
208   * @extra_size: allocate this extra size after the main soundcard structure
209   * @card_ret: the pointer to store the created card instance
210   *
211   * This function works like snd_card_new() but manages the allocated resource
212   * via devres, i.e. you don't need to free explicitly.
213   *
214   * When a snd_card object is created with this function and registered via
215   * snd_card_register(), the very first devres action to call snd_card_free()
216   * is added automatically.  In that way, the resource disconnection is assured
217   * at first, then released in the expected order.
218   *
219   * If an error happens at the probe before snd_card_register() is called and
220   * there have been other devres resources, you'd need to free the card manually
221   * via snd_card_free() call in the error; otherwise it may lead to UAF due to
222   * devres call orders.  You can use snd_card_free_on_error() helper for
223   * handling it more easily.
224   *
225   * Return: zero if successful, or a negative error code
226   */
snd_devm_card_new(struct device * parent,int idx,const char * xid,struct module * module,size_t extra_size,struct snd_card ** card_ret)227  int snd_devm_card_new(struct device *parent, int idx, const char *xid,
228  		      struct module *module, size_t extra_size,
229  		      struct snd_card **card_ret)
230  {
231  	struct snd_card *card;
232  	int err;
233  
234  	*card_ret = NULL;
235  	card = devres_alloc(__snd_card_release, sizeof(*card) + extra_size,
236  			    GFP_KERNEL);
237  	if (!card)
238  		return -ENOMEM;
239  	card->managed = true;
240  	err = snd_card_init(card, parent, idx, xid, module, extra_size);
241  	if (err < 0) {
242  		devres_free(card); /* in managed mode, we need to free manually */
243  		return err;
244  	}
245  
246  	devres_add(parent, card);
247  	*card_ret = card;
248  	return 0;
249  }
250  EXPORT_SYMBOL_GPL(snd_devm_card_new);
251  
252  /**
253   * snd_card_free_on_error - a small helper for handling devm probe errors
254   * @dev: the managed device object
255   * @ret: the return code from the probe callback
256   *
257   * This function handles the explicit snd_card_free() call at the error from
258   * the probe callback.  It's just a small helper for simplifying the error
259   * handling with the managed devices.
260   *
261   * Return: zero if successful, or a negative error code
262   */
snd_card_free_on_error(struct device * dev,int ret)263  int snd_card_free_on_error(struct device *dev, int ret)
264  {
265  	struct snd_card *card;
266  
267  	if (!ret)
268  		return 0;
269  	card = devres_find(dev, __snd_card_release, NULL, NULL);
270  	if (card)
271  		snd_card_free(card);
272  	return ret;
273  }
274  EXPORT_SYMBOL_GPL(snd_card_free_on_error);
275  
snd_card_init(struct snd_card * card,struct device * parent,int idx,const char * xid,struct module * module,size_t extra_size)276  static int snd_card_init(struct snd_card *card, struct device *parent,
277  			 int idx, const char *xid, struct module *module,
278  			 size_t extra_size)
279  {
280  	int err;
281  
282  	if (extra_size > 0)
283  		card->private_data = (char *)card + sizeof(struct snd_card);
284  	if (xid)
285  		strscpy(card->id, xid, sizeof(card->id));
286  	err = 0;
287  	scoped_guard(mutex, &snd_card_mutex) {
288  		if (idx < 0) /* first check the matching module-name slot */
289  			idx = get_slot_from_bitmask(idx, module_slot_match, module);
290  		if (idx < 0) /* if not matched, assign an empty slot */
291  			idx = get_slot_from_bitmask(idx, check_empty_slot, module);
292  		if (idx < 0)
293  			err = -ENODEV;
294  		else if (idx < snd_ecards_limit) {
295  			if (test_bit(idx, snd_cards_lock))
296  				err = -EBUSY;	/* invalid */
297  		} else if (idx >= SNDRV_CARDS)
298  			err = -ENODEV;
299  		if (!err) {
300  			set_bit(idx, snd_cards_lock);		/* lock it */
301  			if (idx >= snd_ecards_limit)
302  				snd_ecards_limit = idx + 1; /* increase the limit */
303  		}
304  	}
305  	if (err < 0) {
306  		dev_err(parent, "cannot find the slot for index %d (range 0-%i), error: %d\n",
307  			idx, snd_ecards_limit - 1, err);
308  		if (!card->managed)
309  			kfree(card); /* manually free here, as no destructor called */
310  		return err;
311  	}
312  	card->dev = parent;
313  	card->number = idx;
314  	WARN_ON(IS_MODULE(CONFIG_SND) && !module);
315  	card->module = module;
316  	INIT_LIST_HEAD(&card->devices);
317  	init_rwsem(&card->controls_rwsem);
318  	rwlock_init(&card->controls_rwlock);
319  	INIT_LIST_HEAD(&card->controls);
320  	INIT_LIST_HEAD(&card->ctl_files);
321  #ifdef CONFIG_SND_CTL_FAST_LOOKUP
322  	xa_init(&card->ctl_numids);
323  	xa_init(&card->ctl_hash);
324  #endif
325  	spin_lock_init(&card->files_lock);
326  	INIT_LIST_HEAD(&card->files_list);
327  	mutex_init(&card->memory_mutex);
328  #ifdef CONFIG_PM
329  	init_waitqueue_head(&card->power_sleep);
330  	init_waitqueue_head(&card->power_ref_sleep);
331  	atomic_set(&card->power_ref, 0);
332  #endif
333  	init_waitqueue_head(&card->remove_sleep);
334  	card->sync_irq = -1;
335  
336  	device_initialize(&card->card_dev);
337  	card->card_dev.parent = parent;
338  	card->card_dev.class = &sound_class;
339  	card->card_dev.release = release_card_device;
340  	card->card_dev.groups = card->dev_groups;
341  	card->dev_groups[0] = &card_dev_attr_group;
342  	err = kobject_set_name(&card->card_dev.kobj, "card%d", idx);
343  	if (err < 0)
344  		goto __error;
345  
346  	snprintf(card->irq_descr, sizeof(card->irq_descr), "%s:%s",
347  		 dev_driver_string(card->dev), dev_name(&card->card_dev));
348  
349  	/* the control interface cannot be accessed from the user space until */
350  	/* snd_cards_bitmask and snd_cards are set with snd_card_register */
351  	err = snd_ctl_create(card);
352  	if (err < 0) {
353  		dev_err(parent, "unable to register control minors\n");
354  		goto __error;
355  	}
356  	err = snd_info_card_create(card);
357  	if (err < 0) {
358  		dev_err(parent, "unable to create card info\n");
359  		goto __error_ctl;
360  	}
361  
362  #ifdef CONFIG_SND_DEBUG
363  	card->debugfs_root = debugfs_create_dir(dev_name(&card->card_dev),
364  						sound_debugfs_root);
365  #endif
366  	return 0;
367  
368        __error_ctl:
369  	snd_device_free_all(card);
370        __error:
371  	put_device(&card->card_dev);
372    	return err;
373  }
374  
375  /**
376   * snd_card_ref - Get the card object from the index
377   * @idx: the card index
378   *
379   * Returns a card object corresponding to the given index or NULL if not found.
380   * Release the object via snd_card_unref().
381   *
382   * Return: a card object or NULL
383   */
snd_card_ref(int idx)384  struct snd_card *snd_card_ref(int idx)
385  {
386  	struct snd_card *card;
387  
388  	guard(mutex)(&snd_card_mutex);
389  	card = snd_cards[idx];
390  	if (card)
391  		get_device(&card->card_dev);
392  	return card;
393  }
394  EXPORT_SYMBOL_GPL(snd_card_ref);
395  
396  /* return non-zero if a card is already locked */
snd_card_locked(int card)397  int snd_card_locked(int card)
398  {
399  	guard(mutex)(&snd_card_mutex);
400  	return test_bit(card, snd_cards_lock);
401  }
402  
snd_disconnect_llseek(struct file * file,loff_t offset,int orig)403  static loff_t snd_disconnect_llseek(struct file *file, loff_t offset, int orig)
404  {
405  	return -ENODEV;
406  }
407  
snd_disconnect_read(struct file * file,char __user * buf,size_t count,loff_t * offset)408  static ssize_t snd_disconnect_read(struct file *file, char __user *buf,
409  				   size_t count, loff_t *offset)
410  {
411  	return -ENODEV;
412  }
413  
snd_disconnect_write(struct file * file,const char __user * buf,size_t count,loff_t * offset)414  static ssize_t snd_disconnect_write(struct file *file, const char __user *buf,
415  				    size_t count, loff_t *offset)
416  {
417  	return -ENODEV;
418  }
419  
snd_disconnect_release(struct inode * inode,struct file * file)420  static int snd_disconnect_release(struct inode *inode, struct file *file)
421  {
422  	struct snd_monitor_file *df = NULL, *_df;
423  
424  	scoped_guard(spinlock, &shutdown_lock) {
425  		list_for_each_entry(_df, &shutdown_files, shutdown_list) {
426  			if (_df->file == file) {
427  				df = _df;
428  				list_del_init(&df->shutdown_list);
429  				break;
430  			}
431  		}
432  	}
433  
434  	if (likely(df)) {
435  		if ((file->f_flags & FASYNC) && df->disconnected_f_op->fasync)
436  			df->disconnected_f_op->fasync(-1, file, 0);
437  		return df->disconnected_f_op->release(inode, file);
438  	}
439  
440  	panic("%s(%p, %p) failed!", __func__, inode, file);
441  }
442  
snd_disconnect_poll(struct file * file,poll_table * wait)443  static __poll_t snd_disconnect_poll(struct file * file, poll_table * wait)
444  {
445  	return EPOLLERR | EPOLLNVAL;
446  }
447  
snd_disconnect_ioctl(struct file * file,unsigned int cmd,unsigned long arg)448  static long snd_disconnect_ioctl(struct file *file,
449  				 unsigned int cmd, unsigned long arg)
450  {
451  	return -ENODEV;
452  }
453  
snd_disconnect_mmap(struct file * file,struct vm_area_struct * vma)454  static int snd_disconnect_mmap(struct file *file, struct vm_area_struct *vma)
455  {
456  	return -ENODEV;
457  }
458  
snd_disconnect_fasync(int fd,struct file * file,int on)459  static int snd_disconnect_fasync(int fd, struct file *file, int on)
460  {
461  	return -ENODEV;
462  }
463  
464  static const struct file_operations snd_shutdown_f_ops =
465  {
466  	.owner = 	THIS_MODULE,
467  	.llseek =	snd_disconnect_llseek,
468  	.read = 	snd_disconnect_read,
469  	.write =	snd_disconnect_write,
470  	.release =	snd_disconnect_release,
471  	.poll =		snd_disconnect_poll,
472  	.unlocked_ioctl = snd_disconnect_ioctl,
473  #ifdef CONFIG_COMPAT
474  	.compat_ioctl = snd_disconnect_ioctl,
475  #endif
476  	.mmap =		snd_disconnect_mmap,
477  	.fasync =	snd_disconnect_fasync
478  };
479  
480  /**
481   *  snd_card_disconnect - disconnect all APIs from the file-operations (user space)
482   *  @card: soundcard structure
483   *
484   *  Disconnects all APIs from the file-operations (user space).
485   *
486   *  Return: Zero, otherwise a negative error code.
487   *
488   *  Note: The current implementation replaces all active file->f_op with special
489   *        dummy file operations (they do nothing except release).
490   */
snd_card_disconnect(struct snd_card * card)491  void snd_card_disconnect(struct snd_card *card)
492  {
493  	struct snd_monitor_file *mfile;
494  
495  	if (!card)
496  		return;
497  
498  	scoped_guard(spinlock, &card->files_lock) {
499  		if (card->shutdown)
500  			return;
501  		card->shutdown = 1;
502  
503  		/* replace file->f_op with special dummy operations */
504  		list_for_each_entry(mfile, &card->files_list, list) {
505  			/* it's critical part, use endless loop */
506  			/* we have no room to fail */
507  			mfile->disconnected_f_op = mfile->file->f_op;
508  
509  			scoped_guard(spinlock, &shutdown_lock)
510  				list_add(&mfile->shutdown_list, &shutdown_files);
511  
512  			mfile->file->f_op = &snd_shutdown_f_ops;
513  			fops_get(mfile->file->f_op);
514  		}
515  	}
516  
517  #ifdef CONFIG_PM
518  	/* wake up sleepers here before other callbacks for avoiding potential
519  	 * deadlocks with other locks (e.g. in kctls);
520  	 * then this notifies the shutdown and sleepers would abort immediately
521  	 */
522  	wake_up_all(&card->power_sleep);
523  #endif
524  
525  	/* notify all connected devices about disconnection */
526  	/* at this point, they cannot respond to any calls except release() */
527  
528  #if IS_ENABLED(CONFIG_SND_MIXER_OSS)
529  	if (snd_mixer_oss_notify_callback)
530  		snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_DISCONNECT);
531  #endif
532  
533  	/* notify all devices that we are disconnected */
534  	snd_device_disconnect_all(card);
535  
536  	if (card->sync_irq > 0)
537  		synchronize_irq(card->sync_irq);
538  
539  	snd_info_card_disconnect(card);
540  #ifdef CONFIG_SND_DEBUG
541  	debugfs_remove(card->debugfs_root);
542  	card->debugfs_root = NULL;
543  #endif
544  
545  	if (card->registered) {
546  		device_del(&card->card_dev);
547  		card->registered = false;
548  	}
549  
550  	/* disable fops (user space) operations for ALSA API */
551  	scoped_guard(mutex, &snd_card_mutex) {
552  		snd_cards[card->number] = NULL;
553  		clear_bit(card->number, snd_cards_lock);
554  	}
555  
556  	snd_power_sync_ref(card);
557  }
558  EXPORT_SYMBOL(snd_card_disconnect);
559  
560  /**
561   * snd_card_disconnect_sync - disconnect card and wait until files get closed
562   * @card: card object to disconnect
563   *
564   * This calls snd_card_disconnect() for disconnecting all belonging components
565   * and waits until all pending files get closed.
566   * It assures that all accesses from user-space finished so that the driver
567   * can release its resources gracefully.
568   */
snd_card_disconnect_sync(struct snd_card * card)569  void snd_card_disconnect_sync(struct snd_card *card)
570  {
571  	snd_card_disconnect(card);
572  
573  	guard(spinlock_irq)(&card->files_lock);
574  	wait_event_lock_irq(card->remove_sleep,
575  			    list_empty(&card->files_list),
576  			    card->files_lock);
577  }
578  EXPORT_SYMBOL_GPL(snd_card_disconnect_sync);
579  
snd_card_do_free(struct snd_card * card)580  static int snd_card_do_free(struct snd_card *card)
581  {
582  	card->releasing = true;
583  #if IS_ENABLED(CONFIG_SND_MIXER_OSS)
584  	if (snd_mixer_oss_notify_callback)
585  		snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE);
586  #endif
587  	snd_device_free_all(card);
588  	if (card->private_free)
589  		card->private_free(card);
590  	if (snd_info_card_free(card) < 0) {
591  		dev_warn(card->dev, "unable to free card info\n");
592  		/* Not fatal error */
593  	}
594  	if (card->release_completion)
595  		complete(card->release_completion);
596  	if (!card->managed)
597  		kfree(card);
598  	return 0;
599  }
600  
601  /**
602   * snd_card_free_when_closed - Disconnect the card, free it later eventually
603   * @card: soundcard structure
604   *
605   * Unlike snd_card_free(), this function doesn't try to release the card
606   * resource immediately, but tries to disconnect at first.  When the card
607   * is still in use, the function returns before freeing the resources.
608   * The card resources will be freed when the refcount gets to zero.
609   *
610   * Return: zero if successful, or a negative error code
611   */
snd_card_free_when_closed(struct snd_card * card)612  void snd_card_free_when_closed(struct snd_card *card)
613  {
614  	if (!card)
615  		return;
616  
617  	snd_card_disconnect(card);
618  	put_device(&card->card_dev);
619  	return;
620  }
621  EXPORT_SYMBOL(snd_card_free_when_closed);
622  
623  /**
624   * snd_card_free - frees given soundcard structure
625   * @card: soundcard structure
626   *
627   * This function releases the soundcard structure and the all assigned
628   * devices automatically.  That is, you don't have to release the devices
629   * by yourself.
630   *
631   * This function waits until the all resources are properly released.
632   *
633   * Return: Zero. Frees all associated devices and frees the control
634   * interface associated to given soundcard.
635   */
snd_card_free(struct snd_card * card)636  void snd_card_free(struct snd_card *card)
637  {
638  	DECLARE_COMPLETION_ONSTACK(released);
639  
640  	/* The call of snd_card_free() is allowed from various code paths;
641  	 * a manual call from the driver and the call via devres_free, and
642  	 * we need to avoid double-free. Moreover, the release via devres
643  	 * may call snd_card_free() twice due to its nature, we need to have
644  	 * the check here at the beginning.
645  	 */
646  	if (card->releasing)
647  		return;
648  
649  	card->release_completion = &released;
650  	snd_card_free_when_closed(card);
651  
652  	/* wait, until all devices are ready for the free operation */
653  	wait_for_completion(&released);
654  }
655  EXPORT_SYMBOL(snd_card_free);
656  
657  /* check, if the character is in the valid ASCII range */
safe_ascii_char(char c)658  static inline bool safe_ascii_char(char c)
659  {
660  	return isascii(c) && isalnum(c);
661  }
662  
663  /* retrieve the last word of shortname or longname */
retrieve_id_from_card_name(const char * name)664  static const char *retrieve_id_from_card_name(const char *name)
665  {
666  	const char *spos = name;
667  
668  	while (*name) {
669  		if (isspace(*name) && safe_ascii_char(name[1]))
670  			spos = name + 1;
671  		name++;
672  	}
673  	return spos;
674  }
675  
676  /* return true if the given id string doesn't conflict any other card ids */
card_id_ok(struct snd_card * card,const char * id)677  static bool card_id_ok(struct snd_card *card, const char *id)
678  {
679  	int i;
680  	if (!snd_info_check_reserved_words(id))
681  		return false;
682  	for (i = 0; i < snd_ecards_limit; i++) {
683  		if (snd_cards[i] && snd_cards[i] != card &&
684  		    !strcmp(snd_cards[i]->id, id))
685  			return false;
686  	}
687  	return true;
688  }
689  
690  /* copy to card->id only with valid letters from nid */
copy_valid_id_string(struct snd_card * card,const char * src,const char * nid)691  static void copy_valid_id_string(struct snd_card *card, const char *src,
692  				 const char *nid)
693  {
694  	char *id = card->id;
695  
696  	while (*nid && !safe_ascii_char(*nid))
697  		nid++;
698  	if (isdigit(*nid))
699  		*id++ = isalpha(*src) ? *src : 'D';
700  	while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) {
701  		if (safe_ascii_char(*nid))
702  			*id++ = *nid;
703  		nid++;
704  	}
705  	*id = 0;
706  }
707  
708  /* Set card->id from the given string
709   * If the string conflicts with other ids, add a suffix to make it unique.
710   */
snd_card_set_id_no_lock(struct snd_card * card,const char * src,const char * nid)711  static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
712  				    const char *nid)
713  {
714  	int len, loops;
715  	bool is_default = false;
716  	char *id;
717  
718  	copy_valid_id_string(card, src, nid);
719  	id = card->id;
720  
721   again:
722  	/* use "Default" for obviously invalid strings
723  	 * ("card" conflicts with proc directories)
724  	 */
725  	if (!*id || !strncmp(id, "card", 4)) {
726  		strcpy(id, "Default");
727  		is_default = true;
728  	}
729  
730  	len = strlen(id);
731  	for (loops = 0; loops < SNDRV_CARDS; loops++) {
732  		char *spos;
733  		char sfxstr[5]; /* "_012" */
734  		int sfxlen;
735  
736  		if (card_id_ok(card, id))
737  			return; /* OK */
738  
739  		/* Add _XYZ suffix */
740  		sprintf(sfxstr, "_%X", loops + 1);
741  		sfxlen = strlen(sfxstr);
742  		if (len + sfxlen >= sizeof(card->id))
743  			spos = id + sizeof(card->id) - sfxlen - 1;
744  		else
745  			spos = id + len;
746  		strcpy(spos, sfxstr);
747  	}
748  	/* fallback to the default id */
749  	if (!is_default) {
750  		*id = 0;
751  		goto again;
752  	}
753  	/* last resort... */
754  	dev_err(card->dev, "unable to set card id (%s)\n", id);
755  	if (card->proc_root->name)
756  		strscpy(card->id, card->proc_root->name, sizeof(card->id));
757  }
758  
759  /**
760   *  snd_card_set_id - set card identification name
761   *  @card: soundcard structure
762   *  @nid: new identification string
763   *
764   *  This function sets the card identification and checks for name
765   *  collisions.
766   */
snd_card_set_id(struct snd_card * card,const char * nid)767  void snd_card_set_id(struct snd_card *card, const char *nid)
768  {
769  	/* check if user specified own card->id */
770  	if (card->id[0] != '\0')
771  		return;
772  	guard(mutex)(&snd_card_mutex);
773  	snd_card_set_id_no_lock(card, nid, nid);
774  }
775  EXPORT_SYMBOL(snd_card_set_id);
776  
id_show(struct device * dev,struct device_attribute * attr,char * buf)777  static ssize_t id_show(struct device *dev,
778  		       struct device_attribute *attr, char *buf)
779  {
780  	struct snd_card *card = container_of(dev, struct snd_card, card_dev);
781  	return sysfs_emit(buf, "%s\n", card->id);
782  }
783  
id_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)784  static ssize_t id_store(struct device *dev, struct device_attribute *attr,
785  			const char *buf, size_t count)
786  {
787  	struct snd_card *card = container_of(dev, struct snd_card, card_dev);
788  	char buf1[sizeof(card->id)];
789  	size_t copy = count > sizeof(card->id) - 1 ?
790  					sizeof(card->id) - 1 : count;
791  	size_t idx;
792  	int c;
793  
794  	for (idx = 0; idx < copy; idx++) {
795  		c = buf[idx];
796  		if (!safe_ascii_char(c) && c != '_' && c != '-')
797  			return -EINVAL;
798  	}
799  	memcpy(buf1, buf, copy);
800  	buf1[copy] = '\0';
801  	guard(mutex)(&snd_card_mutex);
802  	if (!card_id_ok(NULL, buf1))
803  		return -EEXIST;
804  	strcpy(card->id, buf1);
805  	snd_info_card_id_change(card);
806  
807  	return count;
808  }
809  
810  static DEVICE_ATTR_RW(id);
811  
number_show(struct device * dev,struct device_attribute * attr,char * buf)812  static ssize_t number_show(struct device *dev,
813  			   struct device_attribute *attr, char *buf)
814  {
815  	struct snd_card *card = container_of(dev, struct snd_card, card_dev);
816  	return sysfs_emit(buf, "%i\n", card->number);
817  }
818  
819  static DEVICE_ATTR_RO(number);
820  
821  static struct attribute *card_dev_attrs[] = {
822  	&dev_attr_id.attr,
823  	&dev_attr_number.attr,
824  	NULL
825  };
826  
827  static const struct attribute_group card_dev_attr_group = {
828  	.attrs	= card_dev_attrs,
829  };
830  
831  /**
832   * snd_card_add_dev_attr - Append a new sysfs attribute group to card
833   * @card: card instance
834   * @group: attribute group to append
835   *
836   * Return: zero if successful, or a negative error code
837   */
snd_card_add_dev_attr(struct snd_card * card,const struct attribute_group * group)838  int snd_card_add_dev_attr(struct snd_card *card,
839  			  const struct attribute_group *group)
840  {
841  	int i;
842  
843  	/* loop for (arraysize-1) here to keep NULL at the last entry */
844  	for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) {
845  		if (!card->dev_groups[i]) {
846  			card->dev_groups[i] = group;
847  			return 0;
848  		}
849  	}
850  
851  	dev_err(card->dev, "Too many groups assigned\n");
852  	return -ENOSPC;
853  }
854  EXPORT_SYMBOL_GPL(snd_card_add_dev_attr);
855  
trigger_card_free(void * data)856  static void trigger_card_free(void *data)
857  {
858  	snd_card_free(data);
859  }
860  
861  /**
862   *  snd_card_register - register the soundcard
863   *  @card: soundcard structure
864   *
865   *  This function registers all the devices assigned to the soundcard.
866   *  Until calling this, the ALSA control interface is blocked from the
867   *  external accesses.  Thus, you should call this function at the end
868   *  of the initialization of the card.
869   *
870   *  Return: Zero otherwise a negative error code if the registration failed.
871   */
snd_card_register(struct snd_card * card)872  int snd_card_register(struct snd_card *card)
873  {
874  	int err;
875  
876  	if (snd_BUG_ON(!card))
877  		return -EINVAL;
878  
879  	if (!card->registered) {
880  		err = device_add(&card->card_dev);
881  		if (err < 0)
882  			return err;
883  		card->registered = true;
884  	} else {
885  		if (card->managed)
886  			devm_remove_action(card->dev, trigger_card_free, card);
887  	}
888  
889  	if (card->managed) {
890  		err = devm_add_action(card->dev, trigger_card_free, card);
891  		if (err < 0)
892  			return err;
893  	}
894  
895  	err = snd_device_register_all(card);
896  	if (err < 0)
897  		return err;
898  	scoped_guard(mutex, &snd_card_mutex) {
899  		if (snd_cards[card->number]) {
900  			/* already registered */
901  			return snd_info_card_register(card); /* register pending info */
902  		}
903  		if (*card->id) {
904  			/* make a unique id name from the given string */
905  			char tmpid[sizeof(card->id)];
906  
907  			memcpy(tmpid, card->id, sizeof(card->id));
908  			snd_card_set_id_no_lock(card, tmpid, tmpid);
909  		} else {
910  			/* create an id from either shortname or longname */
911  			const char *src;
912  
913  			src = *card->shortname ? card->shortname : card->longname;
914  			snd_card_set_id_no_lock(card, src,
915  						retrieve_id_from_card_name(src));
916  		}
917  		snd_cards[card->number] = card;
918  	}
919  	err = snd_info_card_register(card);
920  	if (err < 0)
921  		return err;
922  
923  #if IS_ENABLED(CONFIG_SND_MIXER_OSS)
924  	if (snd_mixer_oss_notify_callback)
925  		snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER);
926  #endif
927  	return 0;
928  }
929  EXPORT_SYMBOL(snd_card_register);
930  
931  #ifdef CONFIG_SND_PROC_FS
snd_card_info_read(struct snd_info_entry * entry,struct snd_info_buffer * buffer)932  static void snd_card_info_read(struct snd_info_entry *entry,
933  			       struct snd_info_buffer *buffer)
934  {
935  	int idx, count;
936  	struct snd_card *card;
937  
938  	for (idx = count = 0; idx < SNDRV_CARDS; idx++) {
939  		guard(mutex)(&snd_card_mutex);
940  		card = snd_cards[idx];
941  		if (card) {
942  			count++;
943  			snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n",
944  					idx,
945  					card->id,
946  					card->driver,
947  					card->shortname);
948  			snd_iprintf(buffer, "                      %s\n",
949  					card->longname);
950  		}
951  	}
952  	if (!count)
953  		snd_iprintf(buffer, "--- no soundcards ---\n");
954  }
955  
956  #ifdef CONFIG_SND_OSSEMUL
snd_card_info_read_oss(struct snd_info_buffer * buffer)957  void snd_card_info_read_oss(struct snd_info_buffer *buffer)
958  {
959  	int idx, count;
960  	struct snd_card *card;
961  
962  	for (idx = count = 0; idx < SNDRV_CARDS; idx++) {
963  		guard(mutex)(&snd_card_mutex);
964  		card = snd_cards[idx];
965  		if (card) {
966  			count++;
967  			snd_iprintf(buffer, "%s\n", card->longname);
968  		}
969  	}
970  	if (!count) {
971  		snd_iprintf(buffer, "--- no soundcards ---\n");
972  	}
973  }
974  
975  #endif
976  
977  #ifdef CONFIG_MODULES
snd_card_module_info_read(struct snd_info_entry * entry,struct snd_info_buffer * buffer)978  static void snd_card_module_info_read(struct snd_info_entry *entry,
979  				      struct snd_info_buffer *buffer)
980  {
981  	int idx;
982  	struct snd_card *card;
983  
984  	for (idx = 0; idx < SNDRV_CARDS; idx++) {
985  		guard(mutex)(&snd_card_mutex);
986  		card = snd_cards[idx];
987  		if (card)
988  			snd_iprintf(buffer, "%2i %s\n",
989  				    idx, card->module->name);
990  	}
991  }
992  #endif
993  
snd_card_info_init(void)994  int __init snd_card_info_init(void)
995  {
996  	struct snd_info_entry *entry;
997  
998  	entry = snd_info_create_module_entry(THIS_MODULE, "cards", NULL);
999  	if (! entry)
1000  		return -ENOMEM;
1001  	entry->c.text.read = snd_card_info_read;
1002  	if (snd_info_register(entry) < 0)
1003  		return -ENOMEM; /* freed in error path */
1004  
1005  #ifdef CONFIG_MODULES
1006  	entry = snd_info_create_module_entry(THIS_MODULE, "modules", NULL);
1007  	if (!entry)
1008  		return -ENOMEM;
1009  	entry->c.text.read = snd_card_module_info_read;
1010  	if (snd_info_register(entry) < 0)
1011  		return -ENOMEM; /* freed in error path */
1012  #endif
1013  
1014  	return 0;
1015  }
1016  #endif /* CONFIG_SND_PROC_FS */
1017  
1018  /**
1019   *  snd_component_add - add a component string
1020   *  @card: soundcard structure
1021   *  @component: the component id string
1022   *
1023   *  This function adds the component id string to the supported list.
1024   *  The component can be referred from the alsa-lib.
1025   *
1026   *  Return: Zero otherwise a negative error code.
1027   */
1028  
snd_component_add(struct snd_card * card,const char * component)1029  int snd_component_add(struct snd_card *card, const char *component)
1030  {
1031  	char *ptr;
1032  	int len = strlen(component);
1033  
1034  	ptr = strstr(card->components, component);
1035  	if (ptr != NULL) {
1036  		if (ptr[len] == '\0' || ptr[len] == ' ')	/* already there */
1037  			return 1;
1038  	}
1039  	if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) {
1040  		snd_BUG();
1041  		return -ENOMEM;
1042  	}
1043  	if (card->components[0] != '\0')
1044  		strcat(card->components, " ");
1045  	strcat(card->components, component);
1046  	return 0;
1047  }
1048  EXPORT_SYMBOL(snd_component_add);
1049  
1050  /**
1051   *  snd_card_file_add - add the file to the file list of the card
1052   *  @card: soundcard structure
1053   *  @file: file pointer
1054   *
1055   *  This function adds the file to the file linked-list of the card.
1056   *  This linked-list is used to keep tracking the connection state,
1057   *  and to avoid the release of busy resources by hotplug.
1058   *
1059   *  Return: zero or a negative error code.
1060   */
snd_card_file_add(struct snd_card * card,struct file * file)1061  int snd_card_file_add(struct snd_card *card, struct file *file)
1062  {
1063  	struct snd_monitor_file *mfile;
1064  
1065  	mfile = kmalloc(sizeof(*mfile), GFP_KERNEL);
1066  	if (mfile == NULL)
1067  		return -ENOMEM;
1068  	mfile->file = file;
1069  	mfile->disconnected_f_op = NULL;
1070  	INIT_LIST_HEAD(&mfile->shutdown_list);
1071  	guard(spinlock)(&card->files_lock);
1072  	if (card->shutdown) {
1073  		kfree(mfile);
1074  		return -ENODEV;
1075  	}
1076  	list_add(&mfile->list, &card->files_list);
1077  	get_device(&card->card_dev);
1078  	return 0;
1079  }
1080  EXPORT_SYMBOL(snd_card_file_add);
1081  
1082  /**
1083   *  snd_card_file_remove - remove the file from the file list
1084   *  @card: soundcard structure
1085   *  @file: file pointer
1086   *
1087   *  This function removes the file formerly added to the card via
1088   *  snd_card_file_add() function.
1089   *  If all files are removed and snd_card_free_when_closed() was
1090   *  called beforehand, it processes the pending release of
1091   *  resources.
1092   *
1093   *  Return: Zero or a negative error code.
1094   */
snd_card_file_remove(struct snd_card * card,struct file * file)1095  int snd_card_file_remove(struct snd_card *card, struct file *file)
1096  {
1097  	struct snd_monitor_file *mfile, *found = NULL;
1098  
1099  	scoped_guard(spinlock, &card->files_lock) {
1100  		list_for_each_entry(mfile, &card->files_list, list) {
1101  			if (mfile->file == file) {
1102  				list_del(&mfile->list);
1103  				scoped_guard(spinlock, &shutdown_lock)
1104  					list_del(&mfile->shutdown_list);
1105  				if (mfile->disconnected_f_op)
1106  					fops_put(mfile->disconnected_f_op);
1107  				found = mfile;
1108  				break;
1109  			}
1110  		}
1111  		if (list_empty(&card->files_list))
1112  			wake_up_all(&card->remove_sleep);
1113  	}
1114  	if (!found) {
1115  		dev_err(card->dev, "card file remove problem (%p)\n", file);
1116  		return -ENOENT;
1117  	}
1118  	kfree(found);
1119  	put_device(&card->card_dev);
1120  	return 0;
1121  }
1122  EXPORT_SYMBOL(snd_card_file_remove);
1123  
1124  #ifdef CONFIG_PM
1125  /**
1126   * snd_power_ref_and_wait - wait until the card gets powered up
1127   * @card: soundcard structure
1128   *
1129   * Take the power_ref reference count of the given card, and
1130   * wait until the card gets powered up to SNDRV_CTL_POWER_D0 state.
1131   * The refcount is down again while sleeping until power-up, hence this
1132   * function can be used for syncing the floating control ops accesses,
1133   * typically around calling control ops.
1134   *
1135   * The caller needs to pull down the refcount via snd_power_unref() later
1136   * no matter whether the error is returned from this function or not.
1137   *
1138   * Return: Zero if successful, or a negative error code.
1139   */
snd_power_ref_and_wait(struct snd_card * card)1140  int snd_power_ref_and_wait(struct snd_card *card)
1141  {
1142  	snd_power_ref(card);
1143  	if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0)
1144  		return 0;
1145  	wait_event_cmd(card->power_sleep,
1146  		       card->shutdown ||
1147  		       snd_power_get_state(card) == SNDRV_CTL_POWER_D0,
1148  		       snd_power_unref(card), snd_power_ref(card));
1149  	return card->shutdown ? -ENODEV : 0;
1150  }
1151  EXPORT_SYMBOL_GPL(snd_power_ref_and_wait);
1152  
1153  /**
1154   * snd_power_wait - wait until the card gets powered up (old form)
1155   * @card: soundcard structure
1156   *
1157   * Wait until the card gets powered up to SNDRV_CTL_POWER_D0 state.
1158   *
1159   * Return: Zero if successful, or a negative error code.
1160   */
snd_power_wait(struct snd_card * card)1161  int snd_power_wait(struct snd_card *card)
1162  {
1163  	int ret;
1164  
1165  	ret = snd_power_ref_and_wait(card);
1166  	snd_power_unref(card);
1167  	return ret;
1168  }
1169  EXPORT_SYMBOL(snd_power_wait);
1170  #endif /* CONFIG_PM */
1171