Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
init.c
Go to the documentation of this file.
1 /*
2  * Initialization routines
3  * Copyright (c) by Jaroslav Kysela <[email protected]>
4  *
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21 
22 #include <linux/init.h>
23 #include <linux/sched.h>
24 #include <linux/module.h>
25 #include <linux/device.h>
26 #include <linux/file.h>
27 #include <linux/slab.h>
28 #include <linux/time.h>
29 #include <linux/ctype.h>
30 #include <linux/pm.h>
31 
32 #include <sound/core.h>
33 #include <sound/control.h>
34 #include <sound/info.h>
35 
36 /* monitor files for graceful shutdown (hotplug) */
38  struct file *file;
40  struct list_head shutdown_list; /* still need to shutdown */
41  struct list_head list; /* link of monitor files */
42 };
43 
44 static DEFINE_SPINLOCK(shutdown_lock);
45 static LIST_HEAD(shutdown_files);
46 
47 static const struct file_operations snd_shutdown_f_ops;
48 
49 static unsigned int snd_cards_lock; /* locked for registering/using */
51 EXPORT_SYMBOL(snd_cards);
52 
53 static DEFINE_MUTEX(snd_card_mutex);
54 
55 static char *slots[SNDRV_CARDS];
56 module_param_array(slots, charp, NULL, 0444);
57 MODULE_PARM_DESC(slots, "Module names assigned to the slots.");
58 
59 /* return non-zero if the given index is reserved for the given
60  * module via slots option
61  */
62 static int module_slot_match(struct module *module, int idx)
63 {
64  int match = 1;
65 #ifdef MODULE
66  const char *s1, *s2;
67 
68  if (!module || !module->name || !slots[idx])
69  return 0;
70 
71  s1 = module->name;
72  s2 = slots[idx];
73  if (*s2 == '!') {
74  match = 0; /* negative match */
75  s2++;
76  }
77  /* compare module name strings
78  * hyphens are handled as equivalent with underscore
79  */
80  for (;;) {
81  char c1 = *s1++;
82  char c2 = *s2++;
83  if (c1 == '-')
84  c1 = '_';
85  if (c2 == '-')
86  c2 = '_';
87  if (c1 != c2)
88  return !match;
89  if (!c1)
90  break;
91  }
92 #endif /* MODULE */
93  return match;
94 }
95 
96 #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
97 int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag);
98 EXPORT_SYMBOL(snd_mixer_oss_notify_callback);
99 #endif
100 
101 #ifdef CONFIG_PROC_FS
102 static void snd_card_id_read(struct snd_info_entry *entry,
103  struct snd_info_buffer *buffer)
104 {
105  snd_iprintf(buffer, "%s\n", entry->card->id);
106 }
107 
108 static inline int init_info_for_card(struct snd_card *card)
109 {
110  int err;
111  struct snd_info_entry *entry;
112 
113  if ((err = snd_info_card_register(card)) < 0) {
114  snd_printd("unable to create card info\n");
115  return err;
116  }
117  if ((entry = snd_info_create_card_entry(card, "id", card->proc_root)) == NULL) {
118  snd_printd("unable to create card entry\n");
119  return err;
120  }
121  entry->c.text.read = snd_card_id_read;
122  if (snd_info_register(entry) < 0) {
123  snd_info_free_entry(entry);
124  entry = NULL;
125  }
126  card->proc_id = entry;
127  return 0;
128 }
129 #else /* !CONFIG_PROC_FS */
130 #define init_info_for_card(card)
131 #endif
132 
149 int snd_card_create(int idx, const char *xid,
150  struct module *module, int extra_size,
151  struct snd_card **card_ret)
152 {
153  struct snd_card *card;
154  int err, idx2;
155 
156  if (snd_BUG_ON(!card_ret))
157  return -EINVAL;
158  *card_ret = NULL;
159 
160  if (extra_size < 0)
161  extra_size = 0;
162  card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL);
163  if (!card)
164  return -ENOMEM;
165  if (xid)
166  strlcpy(card->id, xid, sizeof(card->id));
167  err = 0;
168  mutex_lock(&snd_card_mutex);
169  if (idx < 0) {
170  for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)
171  /* idx == -1 == 0xffff means: take any free slot */
172  if (~snd_cards_lock & idx & 1<<idx2) {
173  if (module_slot_match(module, idx2)) {
174  idx = idx2;
175  break;
176  }
177  }
178  }
179  if (idx < 0) {
180  for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++)
181  /* idx == -1 == 0xffff means: take any free slot */
182  if (~snd_cards_lock & idx & 1<<idx2) {
183  if (!slots[idx2] || !*slots[idx2]) {
184  idx = idx2;
185  break;
186  }
187  }
188  }
189  if (idx < 0)
190  err = -ENODEV;
191  else if (idx < snd_ecards_limit) {
192  if (snd_cards_lock & (1 << idx))
193  err = -EBUSY; /* invalid */
194  } else if (idx >= SNDRV_CARDS)
195  err = -ENODEV;
196  if (err < 0) {
197  mutex_unlock(&snd_card_mutex);
198  snd_printk(KERN_ERR "cannot find the slot for index %d (range 0-%i), error: %d\n",
199  idx, snd_ecards_limit - 1, err);
200  goto __error;
201  }
202  snd_cards_lock |= 1 << idx; /* lock it */
203  if (idx >= snd_ecards_limit)
204  snd_ecards_limit = idx + 1; /* increase the limit */
205  mutex_unlock(&snd_card_mutex);
206  card->number = idx;
207  card->module = module;
208  INIT_LIST_HEAD(&card->devices);
209  init_rwsem(&card->controls_rwsem);
211  INIT_LIST_HEAD(&card->controls);
212  INIT_LIST_HEAD(&card->ctl_files);
213  spin_lock_init(&card->files_lock);
214  INIT_LIST_HEAD(&card->files_list);
216  atomic_set(&card->refcount, 0);
217 #ifdef CONFIG_PM
218  mutex_init(&card->power_lock);
219  init_waitqueue_head(&card->power_sleep);
220 #endif
221  /* the control interface cannot be accessed from the user space until */
222  /* snd_cards_bitmask and snd_cards are set with snd_card_register */
223  err = snd_ctl_create(card);
224  if (err < 0) {
225  snd_printk(KERN_ERR "unable to register control minors\n");
226  goto __error;
227  }
228  err = snd_info_card_create(card);
229  if (err < 0) {
230  snd_printk(KERN_ERR "unable to create card info\n");
231  goto __error_ctl;
232  }
233  if (extra_size > 0)
234  card->private_data = (char *)card + sizeof(struct snd_card);
235  *card_ret = card;
236  return 0;
237 
238  __error_ctl:
240  __error:
241  kfree(card);
242  return err;
243 }
245 
246 /* return non-zero if a card is already locked */
247 int snd_card_locked(int card)
248 {
249  int locked;
250 
251  mutex_lock(&snd_card_mutex);
252  locked = snd_cards_lock & (1 << card);
253  mutex_unlock(&snd_card_mutex);
254  return locked;
255 }
256 
257 static loff_t snd_disconnect_llseek(struct file *file, loff_t offset, int orig)
258 {
259  return -ENODEV;
260 }
261 
262 static ssize_t snd_disconnect_read(struct file *file, char __user *buf,
263  size_t count, loff_t *offset)
264 {
265  return -ENODEV;
266 }
267 
268 static ssize_t snd_disconnect_write(struct file *file, const char __user *buf,
269  size_t count, loff_t *offset)
270 {
271  return -ENODEV;
272 }
273 
274 static int snd_disconnect_release(struct inode *inode, struct file *file)
275 {
276  struct snd_monitor_file *df = NULL, *_df;
277 
278  spin_lock(&shutdown_lock);
279  list_for_each_entry(_df, &shutdown_files, shutdown_list) {
280  if (_df->file == file) {
281  df = _df;
282  list_del_init(&df->shutdown_list);
283  break;
284  }
285  }
286  spin_unlock(&shutdown_lock);
287 
288  if (likely(df)) {
289  if ((file->f_flags & FASYNC) && df->disconnected_f_op->fasync)
290  df->disconnected_f_op->fasync(-1, file, 0);
291  return df->disconnected_f_op->release(inode, file);
292  }
293 
294  panic("%s(%p, %p) failed!", __func__, inode, file);
295 }
296 
297 static unsigned int snd_disconnect_poll(struct file * file, poll_table * wait)
298 {
299  return POLLERR | POLLNVAL;
300 }
301 
302 static long snd_disconnect_ioctl(struct file *file,
303  unsigned int cmd, unsigned long arg)
304 {
305  return -ENODEV;
306 }
307 
308 static int snd_disconnect_mmap(struct file *file, struct vm_area_struct *vma)
309 {
310  return -ENODEV;
311 }
312 
313 static int snd_disconnect_fasync(int fd, struct file *file, int on)
314 {
315  return -ENODEV;
316 }
317 
318 static const struct file_operations snd_shutdown_f_ops =
319 {
320  .owner = THIS_MODULE,
321  .llseek = snd_disconnect_llseek,
322  .read = snd_disconnect_read,
323  .write = snd_disconnect_write,
324  .release = snd_disconnect_release,
325  .poll = snd_disconnect_poll,
326  .unlocked_ioctl = snd_disconnect_ioctl,
327 #ifdef CONFIG_COMPAT
328  .compat_ioctl = snd_disconnect_ioctl,
329 #endif
330  .mmap = snd_disconnect_mmap,
331  .fasync = snd_disconnect_fasync
332 };
333 
345 int snd_card_disconnect(struct snd_card *card)
346 {
347  struct snd_monitor_file *mfile;
348  int err;
349 
350  if (!card)
351  return -EINVAL;
352 
353  spin_lock(&card->files_lock);
354  if (card->shutdown) {
355  spin_unlock(&card->files_lock);
356  return 0;
357  }
358  card->shutdown = 1;
359  spin_unlock(&card->files_lock);
360 
361  /* phase 1: disable fops (user space) operations for ALSA API */
362  mutex_lock(&snd_card_mutex);
363  snd_cards[card->number] = NULL;
364  snd_cards_lock &= ~(1 << card->number);
365  mutex_unlock(&snd_card_mutex);
366 
367  /* phase 2: replace file->f_op with special dummy operations */
368 
369  spin_lock(&card->files_lock);
370  list_for_each_entry(mfile, &card->files_list, list) {
371  /* it's critical part, use endless loop */
372  /* we have no room to fail */
373  mfile->disconnected_f_op = mfile->file->f_op;
374 
375  spin_lock(&shutdown_lock);
376  list_add(&mfile->shutdown_list, &shutdown_files);
377  spin_unlock(&shutdown_lock);
378 
379  mfile->file->f_op = &snd_shutdown_f_ops;
380  fops_get(mfile->file->f_op);
381  }
382  spin_unlock(&card->files_lock);
383 
384  /* phase 3: notify all connected devices about disconnection */
385  /* at this point, they cannot respond to any calls except release() */
386 
387 #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
388  if (snd_mixer_oss_notify_callback)
389  snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_DISCONNECT);
390 #endif
391 
392  /* notify all devices that we are disconnected */
393  err = snd_device_disconnect_all(card);
394  if (err < 0)
395  snd_printk(KERN_ERR "not all devices for card %i can be disconnected\n", card->number);
396 
397  snd_info_card_disconnect(card);
398  if (card->card_dev) {
400  card->card_dev = NULL;
401  }
402 #ifdef CONFIG_PM
403  wake_up(&card->power_sleep);
404 #endif
405  return 0;
406 }
407 
409 
421 static int snd_card_do_free(struct snd_card *card)
422 {
423 #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
424  if (snd_mixer_oss_notify_callback)
425  snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_FREE);
426 #endif
427  if (snd_device_free_all(card, SNDRV_DEV_CMD_PRE) < 0) {
428  snd_printk(KERN_ERR "unable to free all devices (pre)\n");
429  /* Fatal, but this situation should never occur */
430  }
431  if (snd_device_free_all(card, SNDRV_DEV_CMD_NORMAL) < 0) {
432  snd_printk(KERN_ERR "unable to free all devices (normal)\n");
433  /* Fatal, but this situation should never occur */
434  }
435  if (snd_device_free_all(card, SNDRV_DEV_CMD_POST) < 0) {
436  snd_printk(KERN_ERR "unable to free all devices (post)\n");
437  /* Fatal, but this situation should never occur */
438  }
439  if (card->private_free)
440  card->private_free(card);
441  snd_info_free_entry(card->proc_id);
442  if (snd_info_card_free(card) < 0) {
443  snd_printk(KERN_WARNING "unable to free card info\n");
444  /* Not fatal error */
445  }
446  kfree(card);
447  return 0;
448 }
449 
457 void snd_card_unref(struct snd_card *card)
458 {
459  if (atomic_dec_and_test(&card->refcount)) {
460  wake_up(&card->shutdown_sleep);
461  if (card->free_on_last_close)
462  snd_card_do_free(card);
463  }
464 }
466 
468 {
469  int ret;
470 
471  atomic_inc(&card->refcount);
472  ret = snd_card_disconnect(card);
473  if (ret) {
474  atomic_dec(&card->refcount);
475  return ret;
476  }
477 
478  card->free_on_last_close = 1;
479  if (atomic_dec_and_test(&card->refcount))
480  snd_card_do_free(card);
481  return 0;
482 }
483 
485 
486 int snd_card_free(struct snd_card *card)
487 {
488  int ret = snd_card_disconnect(card);
489  if (ret)
490  return ret;
491 
492  /* wait, until all devices are ready for the free operation */
494  snd_card_do_free(card);
495  return 0;
496 }
497 
499 
500 /* retrieve the last word of shortname or longname */
501 static const char *retrieve_id_from_card_name(const char *name)
502 {
503  const char *spos = name;
504 
505  while (*name) {
506  if (isspace(*name) && isalnum(name[1]))
507  spos = name + 1;
508  name++;
509  }
510  return spos;
511 }
512 
513 /* return true if the given id string doesn't conflict any other card ids */
514 static bool card_id_ok(struct snd_card *card, const char *id)
515 {
516  int i;
517  if (!snd_info_check_reserved_words(id))
518  return false;
519  for (i = 0; i < snd_ecards_limit; i++) {
520  if (snd_cards[i] && snd_cards[i] != card &&
521  !strcmp(snd_cards[i]->id, id))
522  return false;
523  }
524  return true;
525 }
526 
527 /* copy to card->id only with valid letters from nid */
528 static void copy_valid_id_string(struct snd_card *card, const char *src,
529  const char *nid)
530 {
531  char *id = card->id;
532 
533  while (*nid && !isalnum(*nid))
534  nid++;
535  if (isdigit(*nid))
536  *id++ = isalpha(*src) ? *src : 'D';
537  while (*nid && (size_t)(id - card->id) < sizeof(card->id) - 1) {
538  if (isalnum(*nid))
539  *id++ = *nid;
540  nid++;
541  }
542  *id = 0;
543 }
544 
545 /* Set card->id from the given string
546  * If the string conflicts with other ids, add a suffix to make it unique.
547  */
548 static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
549  const char *nid)
550 {
551  int len, loops;
552  bool with_suffix;
553  bool is_default = false;
554  char *id;
555 
556  copy_valid_id_string(card, src, nid);
557  id = card->id;
558 
559  again:
560  /* use "Default" for obviously invalid strings
561  * ("card" conflicts with proc directories)
562  */
563  if (!*id || !strncmp(id, "card", 4)) {
564  strcpy(id, "Default");
565  is_default = true;
566  }
567 
568  with_suffix = false;
569  for (loops = 0; loops < SNDRV_CARDS; loops++) {
570  if (card_id_ok(card, id))
571  return; /* OK */
572 
573  len = strlen(id);
574  if (!with_suffix) {
575  /* add the "_X" suffix */
576  char *spos = id + len;
577  if (len > sizeof(card->id) - 3)
578  spos = id + sizeof(card->id) - 3;
579  strcpy(spos, "_1");
580  with_suffix = true;
581  } else {
582  /* modify the existing suffix */
583  if (id[len - 1] != '9')
584  id[len - 1]++;
585  else
586  id[len - 1] = 'A';
587  }
588  }
589  /* fallback to the default id */
590  if (!is_default) {
591  *id = 0;
592  goto again;
593  }
594  /* last resort... */
595  snd_printk(KERN_ERR "unable to set card id (%s)\n", id);
596  if (card->proc_root->name)
597  strcpy(card->id, card->proc_root->name);
598 }
599 
608 void snd_card_set_id(struct snd_card *card, const char *nid)
609 {
610  /* check if user specified own card->id */
611  if (card->id[0] != '\0')
612  return;
613  mutex_lock(&snd_card_mutex);
614  snd_card_set_id_no_lock(card, nid, nid);
615  mutex_unlock(&snd_card_mutex);
616 }
618 
619 static ssize_t
620 card_id_show_attr(struct device *dev,
621  struct device_attribute *attr, char *buf)
622 {
623  struct snd_card *card = dev_get_drvdata(dev);
624  return snprintf(buf, PAGE_SIZE, "%s\n", card ? card->id : "(null)");
625 }
626 
627 static ssize_t
628 card_id_store_attr(struct device *dev, struct device_attribute *attr,
629  const char *buf, size_t count)
630 {
631  struct snd_card *card = dev_get_drvdata(dev);
632  char buf1[sizeof(card->id)];
633  size_t copy = count > sizeof(card->id) - 1 ?
634  sizeof(card->id) - 1 : count;
635  size_t idx;
636  int c;
637 
638  for (idx = 0; idx < copy; idx++) {
639  c = buf[idx];
640  if (!isalnum(c) && c != '_' && c != '-')
641  return -EINVAL;
642  }
643  memcpy(buf1, buf, copy);
644  buf1[copy] = '\0';
645  mutex_lock(&snd_card_mutex);
646  if (!card_id_ok(NULL, buf1)) {
647  mutex_unlock(&snd_card_mutex);
648  return -EEXIST;
649  }
650  strcpy(card->id, buf1);
651  snd_info_card_id_change(card);
652  mutex_unlock(&snd_card_mutex);
653 
654  return count;
655 }
656 
657 static struct device_attribute card_id_attrs =
658  __ATTR(id, S_IRUGO | S_IWUSR, card_id_show_attr, card_id_store_attr);
659 
660 static ssize_t
661 card_number_show_attr(struct device *dev,
662  struct device_attribute *attr, char *buf)
663 {
664  struct snd_card *card = dev_get_drvdata(dev);
665  return snprintf(buf, PAGE_SIZE, "%i\n", card ? card->number : -1);
666 }
667 
668 static struct device_attribute card_number_attrs =
669  __ATTR(number, S_IRUGO, card_number_show_attr, NULL);
670 
682 int snd_card_register(struct snd_card *card)
683 {
684  int err;
685 
686  if (snd_BUG_ON(!card))
687  return -EINVAL;
688 
689  if (!card->card_dev) {
690  card->card_dev = device_create(sound_class, card->dev,
691  MKDEV(0, 0), card,
692  "card%i", card->number);
693  if (IS_ERR(card->card_dev))
694  card->card_dev = NULL;
695  }
696 
697  if ((err = snd_device_register_all(card)) < 0)
698  return err;
699  mutex_lock(&snd_card_mutex);
700  if (snd_cards[card->number]) {
701  /* already registered */
702  mutex_unlock(&snd_card_mutex);
703  return 0;
704  }
705  if (*card->id) {
706  /* make a unique id name from the given string */
707  char tmpid[sizeof(card->id)];
708  memcpy(tmpid, card->id, sizeof(card->id));
709  snd_card_set_id_no_lock(card, tmpid, tmpid);
710  } else {
711  /* create an id from either shortname or longname */
712  const char *src;
713  src = *card->shortname ? card->shortname : card->longname;
714  snd_card_set_id_no_lock(card, src,
715  retrieve_id_from_card_name(src));
716  }
717  snd_cards[card->number] = card;
718  mutex_unlock(&snd_card_mutex);
719  init_info_for_card(card);
720 #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
721  if (snd_mixer_oss_notify_callback)
722  snd_mixer_oss_notify_callback(card, SND_MIXER_OSS_NOTIFY_REGISTER);
723 #endif
724  if (card->card_dev) {
725  err = device_create_file(card->card_dev, &card_id_attrs);
726  if (err < 0)
727  return err;
728  err = device_create_file(card->card_dev, &card_number_attrs);
729  if (err < 0)
730  return err;
731  }
732 
733  return 0;
734 }
735 
737 
738 #ifdef CONFIG_PROC_FS
739 static struct snd_info_entry *snd_card_info_entry;
740 
741 static void snd_card_info_read(struct snd_info_entry *entry,
742  struct snd_info_buffer *buffer)
743 {
744  int idx, count;
745  struct snd_card *card;
746 
747  for (idx = count = 0; idx < SNDRV_CARDS; idx++) {
748  mutex_lock(&snd_card_mutex);
749  if ((card = snd_cards[idx]) != NULL) {
750  count++;
751  snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n",
752  idx,
753  card->id,
754  card->driver,
755  card->shortname);
756  snd_iprintf(buffer, " %s\n",
757  card->longname);
758  }
759  mutex_unlock(&snd_card_mutex);
760  }
761  if (!count)
762  snd_iprintf(buffer, "--- no soundcards ---\n");
763 }
764 
765 #ifdef CONFIG_SND_OSSEMUL
766 
767 void snd_card_info_read_oss(struct snd_info_buffer *buffer)
768 {
769  int idx, count;
770  struct snd_card *card;
771 
772  for (idx = count = 0; idx < SNDRV_CARDS; idx++) {
773  mutex_lock(&snd_card_mutex);
774  if ((card = snd_cards[idx]) != NULL) {
775  count++;
776  snd_iprintf(buffer, "%s\n", card->longname);
777  }
778  mutex_unlock(&snd_card_mutex);
779  }
780  if (!count) {
781  snd_iprintf(buffer, "--- no soundcards ---\n");
782  }
783 }
784 
785 #endif
786 
787 #ifdef MODULE
788 static struct snd_info_entry *snd_card_module_info_entry;
789 static void snd_card_module_info_read(struct snd_info_entry *entry,
790  struct snd_info_buffer *buffer)
791 {
792  int idx;
793  struct snd_card *card;
794 
795  for (idx = 0; idx < SNDRV_CARDS; idx++) {
796  mutex_lock(&snd_card_mutex);
797  if ((card = snd_cards[idx]) != NULL)
798  snd_iprintf(buffer, "%2i %s\n",
799  idx, card->module->name);
800  mutex_unlock(&snd_card_mutex);
801  }
802 }
803 #endif
804 
805 int __init snd_card_info_init(void)
806 {
807  struct snd_info_entry *entry;
808 
809  entry = snd_info_create_module_entry(THIS_MODULE, "cards", NULL);
810  if (! entry)
811  return -ENOMEM;
812  entry->c.text.read = snd_card_info_read;
813  if (snd_info_register(entry) < 0) {
814  snd_info_free_entry(entry);
815  return -ENOMEM;
816  }
817  snd_card_info_entry = entry;
818 
819 #ifdef MODULE
820  entry = snd_info_create_module_entry(THIS_MODULE, "modules", NULL);
821  if (entry) {
822  entry->c.text.read = snd_card_module_info_read;
823  if (snd_info_register(entry) < 0)
824  snd_info_free_entry(entry);
825  else
826  snd_card_module_info_entry = entry;
827  }
828 #endif
829 
830  return 0;
831 }
832 
833 int __exit snd_card_info_done(void)
834 {
835  snd_info_free_entry(snd_card_info_entry);
836 #ifdef MODULE
837  snd_info_free_entry(snd_card_module_info_entry);
838 #endif
839  return 0;
840 }
841 
842 #endif /* CONFIG_PROC_FS */
843 
855 int snd_component_add(struct snd_card *card, const char *component)
856 {
857  char *ptr;
858  int len = strlen(component);
859 
860  ptr = strstr(card->components, component);
861  if (ptr != NULL) {
862  if (ptr[len] == '\0' || ptr[len] == ' ') /* already there */
863  return 1;
864  }
865  if (strlen(card->components) + 1 + len + 1 > sizeof(card->components)) {
866  snd_BUG();
867  return -ENOMEM;
868  }
869  if (card->components[0] != '\0')
870  strcat(card->components, " ");
871  strcat(card->components, component);
872  return 0;
873 }
874 
876 
888 int snd_card_file_add(struct snd_card *card, struct file *file)
889 {
890  struct snd_monitor_file *mfile;
891 
892  mfile = kmalloc(sizeof(*mfile), GFP_KERNEL);
893  if (mfile == NULL)
894  return -ENOMEM;
895  mfile->file = file;
896  mfile->disconnected_f_op = NULL;
897  INIT_LIST_HEAD(&mfile->shutdown_list);
898  spin_lock(&card->files_lock);
899  if (card->shutdown) {
900  spin_unlock(&card->files_lock);
901  kfree(mfile);
902  return -ENODEV;
903  }
904  list_add(&mfile->list, &card->files_list);
905  atomic_inc(&card->refcount);
906  spin_unlock(&card->files_lock);
907  return 0;
908 }
909 
911 
925 int snd_card_file_remove(struct snd_card *card, struct file *file)
926 {
927  struct snd_monitor_file *mfile, *found = NULL;
928 
929  spin_lock(&card->files_lock);
930  list_for_each_entry(mfile, &card->files_list, list) {
931  if (mfile->file == file) {
932  list_del(&mfile->list);
933  spin_lock(&shutdown_lock);
934  list_del(&mfile->shutdown_list);
935  spin_unlock(&shutdown_lock);
936  if (mfile->disconnected_f_op)
937  fops_put(mfile->disconnected_f_op);
938  found = mfile;
939  break;
940  }
941  }
942  spin_unlock(&card->files_lock);
943  if (!found) {
944  snd_printk(KERN_ERR "ALSA card file remove problem (%p)\n", file);
945  return -ENOENT;
946  }
947  kfree(found);
948  snd_card_unref(card);
949  return 0;
950 }
951 
953 
954 #ifdef CONFIG_PM
955 
964 int snd_power_wait(struct snd_card *card, unsigned int power_state)
965 {
967  int result = 0;
968 
969  /* fastpath */
970  if (snd_power_get_state(card) == power_state)
971  return 0;
972  init_waitqueue_entry(&wait, current);
973  add_wait_queue(&card->power_sleep, &wait);
974  while (1) {
975  if (card->shutdown) {
976  result = -ENODEV;
977  break;
978  }
979  if (snd_power_get_state(card) == power_state)
980  break;
982  snd_power_unlock(card);
983  schedule_timeout(30 * HZ);
984  snd_power_lock(card);
985  }
986  remove_wait_queue(&card->power_sleep, &wait);
987  return result;
988 }
989 
990 EXPORT_SYMBOL(snd_power_wait);
991 #endif /* CONFIG_PM */