| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Misc and compatibility things | 
					
						
							| 
									
										
										
										
											2007-10-15 09:50:19 +02:00
										 |  |  |  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  *   it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  *   the Free Software Foundation; either version 2 of the License, or | 
					
						
							|  |  |  |  *   (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  *   but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  *   GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  *   along with this program; if not, write to the Free Software | 
					
						
							|  |  |  |  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <linux/time.h>
 | 
					
						
							| 
									
										
										
										
											2005-10-10 11:56:31 +02:00
										 |  |  | #include <linux/ioport.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <sound/core.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | #ifdef CONFIG_SND_DEBUG
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_SND_DEBUG_VERBOSE
 | 
					
						
							|  |  |  | #define DEFAULT_DEBUG_LEVEL	2
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define DEFAULT_DEBUG_LEVEL	1
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int debug = DEFAULT_DEBUG_LEVEL; | 
					
						
							|  |  |  | module_param(debug, int, 0644); | 
					
						
							|  |  |  | MODULE_PARM_DESC(debug, "Debug level (0 = disable)"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* CONFIG_SND_DEBUG */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-10 11:56:31 +02:00
										 |  |  | void release_and_free_resource(struct resource *res) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (res) { | 
					
						
							|  |  |  | 		release_resource(res); | 
					
						
							| 
									
										
										
										
											2005-10-10 11:59:52 +02:00
										 |  |  | 		kfree(res); | 
					
						
							| 
									
										
										
										
											2005-10-10 11:56:31 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-28 15:13:39 +02:00
										 |  |  | EXPORT_SYMBOL(release_and_free_resource); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #ifdef CONFIG_SND_VERBOSE_PRINTK
 | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | /* strip the leading path if the given path is absolute */ | 
					
						
							| 
									
										
										
										
											2009-08-27 12:34:54 +02:00
										 |  |  | static const char *sanity_file_name(const char *path) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-27 12:34:54 +02:00
										 |  |  | 	if (*path == '/') | 
					
						
							|  |  |  | 		return strrchr(path, '/') + 1; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return path; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | /* print file and line with a certain printk prefix */ | 
					
						
							|  |  |  | static int print_snd_pfx(unsigned int level, const char *path, int line, | 
					
						
							|  |  |  | 			 const char *format) | 
					
						
							| 
									
										
										
										
											2009-08-27 12:34:54 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	const char *file = sanity_file_name(path); | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | 	char tmp[] = "<0>"; | 
					
						
							|  |  |  | 	const char *pfx = level ? KERN_DEBUG : KERN_DEFAULT; | 
					
						
							|  |  |  | 	int ret = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (format[0] == '<' && format[2] == '>') { | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 		tmp[1] = format[1]; | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | 		pfx = tmp; | 
					
						
							|  |  |  | 		ret = 1; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | 	printk("%sALSA %s:%d: ", pfx, file, line); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define print_snd_pfx(level, path, line, format)	0
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
 | 
					
						
							|  |  |  | void __snd_printk(unsigned int level, const char *path, int line, | 
					
						
							|  |  |  | 		  const char *format, ...) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	va_list args; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | #ifdef CONFIG_SND_DEBUG	
 | 
					
						
							|  |  |  | 	if (debug < level) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	va_start(args, format); | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | 	if (print_snd_pfx(level, path, line, format)) | 
					
						
							|  |  |  | 		format += 3; /* skip the printk level-prefix */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	vprintk(format, args); | 
					
						
							|  |  |  | 	va_end(args); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-27 16:45:07 +02:00
										 |  |  | EXPORT_SYMBOL_GPL(__snd_printk); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-11-24 15:34:06 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_PCI
 | 
					
						
							|  |  |  | #include <linux/pci.h>
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * snd_pci_quirk_lookup - look up a PCI SSID quirk list | 
					
						
							|  |  |  |  * @pci: pci_dev handle | 
					
						
							|  |  |  |  * @list: quirk list, terminated by a null entry | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Look through the given quirk list and finds a matching entry | 
					
						
							|  |  |  |  * with the same PCI SSID.  When subdevice is 0, all subdevice | 
					
						
							|  |  |  |  * values may match. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Returns the matched entry pointer, or NULL if nothing matched. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const struct snd_pci_quirk * | 
					
						
							|  |  |  | snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	const struct snd_pci_quirk *q; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-30 17:27:45 +01:00
										 |  |  | 	for (q = list; q->subvendor; q++) { | 
					
						
							|  |  |  | 		if (q->subvendor != pci->subsystem_vendor) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		if (!q->subdevice || | 
					
						
							|  |  |  | 		    (pci->subsystem_device & q->subdevice_mask) == q->subdevice) | 
					
						
							| 
									
										
										
										
											2006-11-24 15:34:06 +01:00
										 |  |  | 			return q; | 
					
						
							| 
									
										
										
										
											2009-01-30 17:27:45 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-11-24 15:34:06 +01:00
										 |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | EXPORT_SYMBOL(snd_pci_quirk_lookup); | 
					
						
							|  |  |  | #endif
 |