Blame view

sound/sound_firmware.c 1.69 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  #include <linux/vmalloc.h>
  #include <linux/module.h>
  #include <linux/fs.h>
  #include <linux/mm.h>
e8edc6e03   Alexey Dobriyan   Detach sched.h fr...
5
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
  #include <asm/uaccess.h>
b9dd6ffc3   Adrian Bunk   [PATCH] build sou...
7
  #include "oss/sound_firmware.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  
  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;
  	}
977a6ef3c   Xiaochen Wang   sound: read i_siz...
23
  	l = i_size_read(filp->f_path.dentry->d_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
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
  	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...
67
   *	request_firmware.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
71
72
73
74
75
76
77
78
79
   */
   
  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...
80
  EXPORT_SYMBOL(mod_firmware_load);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81

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