linux/sound/core/misc.c
<<
>>
Prefs
   1/*
   2 *  Misc and compatibility things
   3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   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/time.h>
  24#include <linux/slab.h>
  25#include <linux/ioport.h>
  26#include <sound/core.h>
  27
  28#ifdef CONFIG_SND_DEBUG
  29
  30#ifdef CONFIG_SND_DEBUG_VERBOSE
  31#define DEFAULT_DEBUG_LEVEL     2
  32#else
  33#define DEFAULT_DEBUG_LEVEL     1
  34#endif
  35
  36static int debug = DEFAULT_DEBUG_LEVEL;
  37module_param(debug, int, 0644);
  38MODULE_PARM_DESC(debug, "Debug level (0 = disable)");
  39
  40#endif /* CONFIG_SND_DEBUG */
  41
  42void release_and_free_resource(struct resource *res)
  43{
  44        if (res) {
  45                release_resource(res);
  46                kfree(res);
  47        }
  48}
  49
  50EXPORT_SYMBOL(release_and_free_resource);
  51
  52#ifdef CONFIG_SND_VERBOSE_PRINTK
  53/* strip the leading path if the given path is absolute */
  54static const char *sanity_file_name(const char *path)
  55{
  56        if (*path == '/')
  57                return strrchr(path, '/') + 1;
  58        else
  59                return path;
  60}
  61
  62/* print file and line with a certain printk prefix */
  63static int print_snd_pfx(unsigned int level, const char *path, int line,
  64                         const char *format)
  65{
  66        const char *file = sanity_file_name(path);
  67        char tmp[] = "<0>";
  68        const char *pfx = level ? KERN_DEBUG : KERN_DEFAULT;
  69        int ret = 0;
  70
  71        if (format[0] == '<' && format[2] == '>') {
  72                tmp[1] = format[1];
  73                pfx = tmp;
  74                ret = 1;
  75        }
  76        printk("%sALSA %s:%d: ", pfx, file, line);
  77        return ret;
  78}
  79#else
  80#define print_snd_pfx(level, path, line, format)        0
  81#endif
  82
  83#if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
  84void __snd_printk(unsigned int level, const char *path, int line,
  85                  const char *format, ...)
  86{
  87        va_list args;
  88        
  89#ifdef CONFIG_SND_DEBUG 
  90        if (debug < level)
  91                return;
  92#endif
  93        va_start(args, format);
  94        if (print_snd_pfx(level, path, line, format))
  95                format += 3; /* skip the printk level-prefix */
  96        vprintk(format, args);
  97        va_end(args);
  98}
  99EXPORT_SYMBOL_GPL(__snd_printk);
 100#endif
 101
 102#ifdef CONFIG_PCI
 103#include <linux/pci.h>
 104/**
 105 * snd_pci_quirk_lookup_id - look up a PCI SSID quirk list
 106 * @vendor: PCI SSV id
 107 * @device: PCI SSD id
 108 * @list: quirk list, terminated by a null entry
 109 *
 110 * Look through the given quirk list and finds a matching entry
 111 * with the same PCI SSID.  When subdevice is 0, all subdevice
 112 * values may match.
 113 *
 114 * Returns the matched entry pointer, or NULL if nothing matched.
 115 */
 116const struct snd_pci_quirk *
 117snd_pci_quirk_lookup_id(u16 vendor, u16 device,
 118                        const struct snd_pci_quirk *list)
 119{
 120        const struct snd_pci_quirk *q;
 121
 122        for (q = list; q->subvendor; q++) {
 123                if (q->subvendor != vendor)
 124                        continue;
 125                if (!q->subdevice ||
 126                    (device & q->subdevice_mask) == q->subdevice)
 127                        return q;
 128        }
 129        return NULL;
 130}
 131EXPORT_SYMBOL(snd_pci_quirk_lookup_id);
 132
 133/**
 134 * snd_pci_quirk_lookup - look up a PCI SSID quirk list
 135 * @pci: pci_dev handle
 136 * @list: quirk list, terminated by a null entry
 137 *
 138 * Look through the given quirk list and finds a matching entry
 139 * with the same PCI SSID.  When subdevice is 0, all subdevice
 140 * values may match.
 141 *
 142 * Returns the matched entry pointer, or NULL if nothing matched.
 143 */
 144const struct snd_pci_quirk *
 145snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list)
 146{
 147        return snd_pci_quirk_lookup_id(pci->subsystem_vendor,
 148                                       pci->subsystem_device,
 149                                       list);
 150}
 151EXPORT_SYMBOL(snd_pci_quirk_lookup);
 152#endif
 153