sound_firmware.c 1.7 KB

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