root/sound/core/misc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. release_and_free_resource
  2. sanity_file_name
  3. __snd_printk
  4. snd_pci_quirk_lookup_id
  5. snd_pci_quirk_lookup

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  Misc and compatibility things
   4  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   5  */
   6 
   7 #include <linux/init.h>
   8 #include <linux/export.h>
   9 #include <linux/moduleparam.h>
  10 #include <linux/time.h>
  11 #include <linux/slab.h>
  12 #include <linux/ioport.h>
  13 #include <sound/core.h>
  14 
  15 #ifdef CONFIG_SND_DEBUG
  16 
  17 #ifdef CONFIG_SND_DEBUG_VERBOSE
  18 #define DEFAULT_DEBUG_LEVEL     2
  19 #else
  20 #define DEFAULT_DEBUG_LEVEL     1
  21 #endif
  22 
  23 static int debug = DEFAULT_DEBUG_LEVEL;
  24 module_param(debug, int, 0644);
  25 MODULE_PARM_DESC(debug, "Debug level (0 = disable)");
  26 
  27 #endif /* CONFIG_SND_DEBUG */
  28 
  29 void release_and_free_resource(struct resource *res)
  30 {
  31         if (res) {
  32                 release_resource(res);
  33                 kfree(res);
  34         }
  35 }
  36 EXPORT_SYMBOL(release_and_free_resource);
  37 
  38 #ifdef CONFIG_SND_VERBOSE_PRINTK
  39 /* strip the leading path if the given path is absolute */
  40 static const char *sanity_file_name(const char *path)
  41 {
  42         if (*path == '/')
  43                 return strrchr(path, '/') + 1;
  44         else
  45                 return path;
  46 }
  47 #endif
  48 
  49 #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
  50 void __snd_printk(unsigned int level, const char *path, int line,
  51                   const char *format, ...)
  52 {
  53         va_list args;
  54 #ifdef CONFIG_SND_VERBOSE_PRINTK
  55         int kern_level;
  56         struct va_format vaf;
  57         char verbose_fmt[] = KERN_DEFAULT "ALSA %s:%d %pV";
  58         bool level_found = false;
  59 #endif
  60 
  61 #ifdef CONFIG_SND_DEBUG
  62         if (debug < level)
  63                 return;
  64 #endif
  65 
  66         va_start(args, format);
  67 #ifdef CONFIG_SND_VERBOSE_PRINTK
  68         vaf.fmt = format;
  69         vaf.va = &args;
  70 
  71         while ((kern_level = printk_get_level(vaf.fmt)) != 0) {
  72                 const char *end_of_header = printk_skip_level(vaf.fmt);
  73 
  74                 /* Ignore KERN_CONT. We print filename:line for each piece. */
  75                 if (kern_level >= '0' && kern_level <= '7') {
  76                         memcpy(verbose_fmt, vaf.fmt, end_of_header - vaf.fmt);
  77                         level_found = true;
  78                 }
  79 
  80                 vaf.fmt = end_of_header;
  81         }
  82 
  83         if (!level_found && level)
  84                 memcpy(verbose_fmt, KERN_DEBUG, sizeof(KERN_DEBUG) - 1);
  85 
  86         printk(verbose_fmt, sanity_file_name(path), line, &vaf);
  87 #else
  88         vprintk(format, args);
  89 #endif
  90         va_end(args);
  91 }
  92 EXPORT_SYMBOL_GPL(__snd_printk);
  93 #endif
  94 
  95 #ifdef CONFIG_PCI
  96 #include <linux/pci.h>
  97 /**
  98  * snd_pci_quirk_lookup_id - look up a PCI SSID quirk list
  99  * @vendor: PCI SSV id
 100  * @device: PCI SSD id
 101  * @list: quirk list, terminated by a null entry
 102  *
 103  * Look through the given quirk list and finds a matching entry
 104  * with the same PCI SSID.  When subdevice is 0, all subdevice
 105  * values may match.
 106  *
 107  * Returns the matched entry pointer, or NULL if nothing matched.
 108  */
 109 const struct snd_pci_quirk *
 110 snd_pci_quirk_lookup_id(u16 vendor, u16 device,
 111                         const struct snd_pci_quirk *list)
 112 {
 113         const struct snd_pci_quirk *q;
 114 
 115         for (q = list; q->subvendor; q++) {
 116                 if (q->subvendor != vendor)
 117                         continue;
 118                 if (!q->subdevice ||
 119                     (device & q->subdevice_mask) == q->subdevice)
 120                         return q;
 121         }
 122         return NULL;
 123 }
 124 EXPORT_SYMBOL(snd_pci_quirk_lookup_id);
 125 
 126 /**
 127  * snd_pci_quirk_lookup - look up a PCI SSID quirk list
 128  * @pci: pci_dev handle
 129  * @list: quirk list, terminated by a null entry
 130  *
 131  * Look through the given quirk list and finds a matching entry
 132  * with the same PCI SSID.  When subdevice is 0, all subdevice
 133  * values may match.
 134  *
 135  * Returns the matched entry pointer, or NULL if nothing matched.
 136  */
 137 const struct snd_pci_quirk *
 138 snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list)
 139 {
 140         if (!pci)
 141                 return NULL;
 142         return snd_pci_quirk_lookup_id(pci->subsystem_vendor,
 143                                        pci->subsystem_device,
 144                                        list);
 145 }
 146 EXPORT_SYMBOL(snd_pci_quirk_lookup);
 147 #endif

/* [<][>][^][v][top][bottom][index][help] */