Blame view

sound/sound_firmware.c 1.71 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  #include <linux/vmalloc.h>
  #include <linux/module.h>
  #include <linux/fs.h>
  #include <linux/mm.h>
  #include <linux/slab.h>
e8edc6e03   Alexey Dobriyan   Detach sched.h fr...
6
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
  #include <asm/uaccess.h>
b9dd6ffc3   Adrian Bunk   [PATCH] build sou...
8
  #include "oss/sound_firmware.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  
  static int do_mod_firmware_load(const char *fn, char **fp)
  {
  	struct file* filp;
  	long l;
  	char *dp;
  	loff_t pos;
  
  	filp = filp_open(fn, 0, 0);
  	if (IS_ERR(filp))
  	{
  		printk(KERN_INFO "Unable to load '%s'.
  ", fn);
  		return 0;
  	}
7bc563239   Josef Sipek   [PATCH] struct pa...
24
  	l = filp->f_path.dentry->d_inode->i_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  	if (l <= 0 || l > 131072)
  	{
  		printk(KERN_INFO "Invalid firmware '%s'
  ", fn);
  		filp_close(filp, current->files);
  		return 0;
  	}
  	dp = vmalloc(l);
  	if (dp == NULL)
  	{
  		printk(KERN_INFO "Out of memory loading '%s'.
  ", fn);
  		filp_close(filp, current->files);
  		return 0;
  	}
  	pos = 0;
  	if (vfs_read(filp, dp, l, &pos) != l)
  	{
  		printk(KERN_INFO "Failed to read '%s'.
  ", fn);
  		vfree(dp);
  		filp_close(filp, current->files);
  		return 0;
  	}
  	filp_close(filp, current->files);
  	*fp = dp;
  	return (int) l;
  }
  
  /**
   *	mod_firmware_load - load sound driver firmware
   *	@fn: filename
   *	@fp: return for the buffer.
   *
   *	Load the firmware for a sound module (up to 128K) into a buffer.
   *	The buffer is returned in *fp. It is allocated with vmalloc so is
   *	virtually linear and not DMAable. The caller should free it with
   *	vfree when finished.
   *
   *	The length of the buffer is returned on a successful load, the
   *	value zero on a failure.
   *
   *	Caution: This API is not recommended. Firmware should be loaded via
b9dd6ffc3   Adrian Bunk   [PATCH] build sou...
68
   *	request_firmware.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
73
74
75
76
77
78
79
80
   */
   
  int mod_firmware_load(const char *fn, char **fp)
  {
  	int r;
  	mm_segment_t fs = get_fs();
  
  	set_fs(get_ds());
  	r = do_mod_firmware_load(fn, fp);
  	set_fs(fs);
  	return r;
  }
b9dd6ffc3   Adrian Bunk   [PATCH] build sou...
81
  EXPORT_SYMBOL(mod_firmware_load);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82

b9dd6ffc3   Adrian Bunk   [PATCH] build sou...
83
  MODULE_LICENSE("GPL");