From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 16 Apr 2005 15:20:36 -0700 Subject: Linux-2.6.12-rc2 Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip! --- sound/sound_firmware.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 sound/sound_firmware.c (limited to 'sound/sound_firmware.c') diff --git a/sound/sound_firmware.c b/sound/sound_firmware.c new file mode 100644 index 00000000000..6ddadfac35a --- /dev/null +++ b/sound/sound_firmware.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include + +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'.\n", fn); + return 0; + } + l = filp->f_dentry->d_inode->i_size; + if (l <= 0 || l > 131072) + { + printk(KERN_INFO "Invalid firmware '%s'\n", fn); + filp_close(filp, current->files); + return 0; + } + dp = vmalloc(l); + if (dp == NULL) + { + printk(KERN_INFO "Out of memory loading '%s'.\n", 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'.\n", 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 + * an ioctl call and a setup application. This function may disappear + * in future. + */ + +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; +} + -- cgit v1.2.3