diff options
author | Takashi Iwai <tiwai@suse.de> | 2016-07-25 09:39:53 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2016-07-26 04:38:03 -0400 |
commit | 0984d159c8ad6618c6ebd9f00bc3f374fa52bc35 (patch) | |
tree | 442d6bfa62d1f6baee7a251db6adf845ef2ea679 /sound | |
parent | 4a6baf1b35891ebc877e91a803877d69b703e086 (diff) |
sound: oss: Use kernel_read_file_from_path() for mod_firmware_load()
Since recently we have kernel_read_file_from_path(), and it's doing
the same thing as our own home-baked mod_firmware_load(). Let's use
the official API function and clean up the old code.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/Makefile | 1 | ||||
-rw-r--r-- | sound/oss/sound_firmware.h | 29 | ||||
-rw-r--r-- | sound/sound_firmware.c | 77 |
3 files changed, 28 insertions, 79 deletions
diff --git a/sound/Makefile b/sound/Makefile index 77320709fd26..c41bdf5fdf24 100644 --- a/sound/Makefile +++ b/sound/Makefile | |||
@@ -2,7 +2,6 @@ | |||
2 | # | 2 | # |
3 | 3 | ||
4 | obj-$(CONFIG_SOUND) += soundcore.o | 4 | obj-$(CONFIG_SOUND) += soundcore.o |
5 | obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o | ||
6 | obj-$(CONFIG_SOUND_PRIME) += oss/ | 5 | obj-$(CONFIG_SOUND_PRIME) += oss/ |
7 | obj-$(CONFIG_DMASOUND) += oss/ | 6 | obj-$(CONFIG_DMASOUND) += oss/ |
8 | obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \ | 7 | obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \ |
diff --git a/sound/oss/sound_firmware.h b/sound/oss/sound_firmware.h index 0a0cbfdfb855..da4c67e005ed 100644 --- a/sound/oss/sound_firmware.h +++ b/sound/oss/sound_firmware.h | |||
@@ -1,2 +1,29 @@ | |||
1 | extern int mod_firmware_load(const char *fn, char **fp); | 1 | #include <linux/fs.h> |
2 | 2 | ||
3 | /** | ||
4 | * mod_firmware_load - load sound driver firmware | ||
5 | * @fn: filename | ||
6 | * @fp: return for the buffer. | ||
7 | * | ||
8 | * Load the firmware for a sound module (up to 128K) into a buffer. | ||
9 | * The buffer is returned in *fp. It is allocated with vmalloc so is | ||
10 | * virtually linear and not DMAable. The caller should free it with | ||
11 | * vfree when finished. | ||
12 | * | ||
13 | * The length of the buffer is returned on a successful load, the | ||
14 | * value zero on a failure. | ||
15 | * | ||
16 | * Caution: This API is not recommended. Firmware should be loaded via | ||
17 | * request_firmware. | ||
18 | */ | ||
19 | static inline int mod_firmware_load(const char *fn, char **fp) | ||
20 | { | ||
21 | loff_t size; | ||
22 | int err; | ||
23 | |||
24 | err = kernel_read_file_from_path((char *)fn, (void **)fp, &size, | ||
25 | 131072, READING_FIRMWARE); | ||
26 | if (err < 0) | ||
27 | return 0; | ||
28 | return size; | ||
29 | } | ||
diff --git a/sound/sound_firmware.c b/sound/sound_firmware.c deleted file mode 100644 index 026347643c81..000000000000 --- a/sound/sound_firmware.c +++ /dev/null | |||
@@ -1,77 +0,0 @@ | |||
1 | #include <linux/vmalloc.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/fs.h> | ||
4 | #include <linux/file.h> | ||
5 | #include <linux/mm.h> | ||
6 | #include <linux/sched.h> | ||
7 | #include <asm/uaccess.h> | ||
8 | #include "oss/sound_firmware.h" | ||
9 | |||
10 | static int do_mod_firmware_load(const char *fn, char **fp) | ||
11 | { | ||
12 | struct file* filp; | ||
13 | long l; | ||
14 | char *dp; | ||
15 | |||
16 | filp = filp_open(fn, 0, 0); | ||
17 | if (IS_ERR(filp)) | ||
18 | { | ||
19 | printk(KERN_INFO "Unable to load '%s'.\n", fn); | ||
20 | return 0; | ||
21 | } | ||
22 | l = i_size_read(file_inode(filp)); | ||
23 | if (l <= 0 || l > 131072) | ||
24 | { | ||
25 | printk(KERN_INFO "Invalid firmware '%s'\n", fn); | ||
26 | fput(filp); | ||
27 | return 0; | ||
28 | } | ||
29 | dp = vmalloc(l); | ||
30 | if (dp == NULL) | ||
31 | { | ||
32 | printk(KERN_INFO "Out of memory loading '%s'.\n", fn); | ||
33 | fput(filp); | ||
34 | return 0; | ||
35 | } | ||
36 | if (kernel_read(filp, 0, dp, l) != l) | ||
37 | { | ||
38 | printk(KERN_INFO "Failed to read '%s'.\n", fn); | ||
39 | vfree(dp); | ||
40 | fput(filp); | ||
41 | return 0; | ||
42 | } | ||
43 | fput(filp); | ||
44 | *fp = dp; | ||
45 | return (int) l; | ||
46 | } | ||
47 | |||
48 | /** | ||
49 | * mod_firmware_load - load sound driver firmware | ||
50 | * @fn: filename | ||
51 | * @fp: return for the buffer. | ||
52 | * | ||
53 | * Load the firmware for a sound module (up to 128K) into a buffer. | ||
54 | * The buffer is returned in *fp. It is allocated with vmalloc so is | ||
55 | * virtually linear and not DMAable. The caller should free it with | ||
56 | * vfree when finished. | ||
57 | * | ||
58 | * The length of the buffer is returned on a successful load, the | ||
59 | * value zero on a failure. | ||
60 | * | ||
61 | * Caution: This API is not recommended. Firmware should be loaded via | ||
62 | * request_firmware. | ||
63 | */ | ||
64 | |||
65 | int mod_firmware_load(const char *fn, char **fp) | ||
66 | { | ||
67 | int r; | ||
68 | mm_segment_t fs = get_fs(); | ||
69 | |||
70 | set_fs(get_ds()); | ||
71 | r = do_mod_firmware_load(fn, fp); | ||
72 | set_fs(fs); | ||
73 | return r; | ||
74 | } | ||
75 | EXPORT_SYMBOL(mod_firmware_load); | ||
76 | |||
77 | MODULE_LICENSE("GPL"); | ||