vx_hwdep.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Driver for Digigram VX soundcards
  4. *
  5. * DSP firmware management
  6. *
  7. * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
  8. */
  9. #include <linux/device.h>
  10. #include <linux/firmware.h>
  11. #include <linux/slab.h>
  12. #include <linux/vmalloc.h>
  13. #include <linux/module.h>
  14. #include <sound/core.h>
  15. #include <sound/hwdep.h>
  16. #include <sound/vx_core.h>
  17. MODULE_FIRMWARE("vx/bx_1_vxp.b56");
  18. MODULE_FIRMWARE("vx/bx_1_vp4.b56");
  19. MODULE_FIRMWARE("vx/x1_1_vx2.xlx");
  20. MODULE_FIRMWARE("vx/x1_2_v22.xlx");
  21. MODULE_FIRMWARE("vx/x1_1_vxp.xlx");
  22. MODULE_FIRMWARE("vx/x1_1_vp4.xlx");
  23. MODULE_FIRMWARE("vx/bd56002.boot");
  24. MODULE_FIRMWARE("vx/bd563v2.boot");
  25. MODULE_FIRMWARE("vx/bd563s3.boot");
  26. MODULE_FIRMWARE("vx/l_1_vx2.d56");
  27. MODULE_FIRMWARE("vx/l_1_v22.d56");
  28. MODULE_FIRMWARE("vx/l_1_vxp.d56");
  29. MODULE_FIRMWARE("vx/l_1_vp4.d56");
  30. int snd_vx_setup_firmware(struct vx_core *chip)
  31. {
  32. static const char * const fw_files[VX_TYPE_NUMS][4] = {
  33. [VX_TYPE_BOARD] = {
  34. NULL, "x1_1_vx2.xlx", "bd56002.boot", "l_1_vx2.d56",
  35. },
  36. [VX_TYPE_V2] = {
  37. NULL, "x1_2_v22.xlx", "bd563v2.boot", "l_1_v22.d56",
  38. },
  39. [VX_TYPE_MIC] = {
  40. NULL, "x1_2_v22.xlx", "bd563v2.boot", "l_1_v22.d56",
  41. },
  42. [VX_TYPE_VXPOCKET] = {
  43. "bx_1_vxp.b56", "x1_1_vxp.xlx", "bd563s3.boot", "l_1_vxp.d56"
  44. },
  45. [VX_TYPE_VXP440] = {
  46. "bx_1_vp4.b56", "x1_1_vp4.xlx", "bd563s3.boot", "l_1_vp4.d56"
  47. },
  48. };
  49. int i, err;
  50. for (i = 0; i < 4; i++) {
  51. char path[32];
  52. const struct firmware *fw;
  53. if (! fw_files[chip->type][i])
  54. continue;
  55. sprintf(path, "vx/%s", fw_files[chip->type][i]);
  56. if (request_firmware(&fw, path, chip->card->dev)) {
  57. dev_err(chip->card->dev, "vx: can't load firmware %s\n", path);
  58. return -ENOENT;
  59. }
  60. err = chip->ops->load_dsp(chip, i, fw);
  61. if (err < 0) {
  62. release_firmware(fw);
  63. return err;
  64. }
  65. if (i == 1)
  66. chip->chip_status |= VX_STAT_XILINX_LOADED;
  67. #ifdef CONFIG_PM
  68. chip->firmware[i] = fw;
  69. #else
  70. release_firmware(fw);
  71. #endif
  72. }
  73. /* ok, we reached to the last one */
  74. /* create the devices if not built yet */
  75. err = snd_vx_pcm_new(chip);
  76. if (err < 0)
  77. return err;
  78. err = snd_vx_mixer_new(chip);
  79. if (err < 0)
  80. return err;
  81. if (chip->ops->add_controls) {
  82. err = chip->ops->add_controls(chip);
  83. if (err < 0)
  84. return err;
  85. }
  86. chip->chip_status |= VX_STAT_DEVICE_INIT;
  87. chip->chip_status |= VX_STAT_CHIP_INIT;
  88. return snd_card_register(chip->card);
  89. }
  90. /* exported */
  91. void snd_vx_free_firmware(struct vx_core *chip)
  92. {
  93. #ifdef CONFIG_PM
  94. int i;
  95. for (i = 0; i < 4; i++)
  96. release_firmware(chip->firmware[i]);
  97. #endif
  98. }
  99. EXPORT_SYMBOL(snd_vx_setup_firmware);
  100. EXPORT_SYMBOL(snd_vx_free_firmware);