emu8000_synth.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
  4. * and (c) 1999 Steve Ratcliffe <steve@parabola.demon.co.uk>
  5. * Copyright (C) 1999-2000 Takashi Iwai <tiwai@suse.de>
  6. *
  7. * Emu8000 synth plug-in routine
  8. */
  9. #include "emu8000_local.h"
  10. #include <linux/init.h>
  11. #include <linux/module.h>
  12. #include <sound/initval.h>
  13. MODULE_AUTHOR("Takashi Iwai, Steve Ratcliffe");
  14. MODULE_DESCRIPTION("Emu8000 synth plug-in routine");
  15. MODULE_LICENSE("GPL");
  16. /*----------------------------------------------------------------*/
  17. /*
  18. * create a new hardware dependent device for Emu8000
  19. */
  20. static int snd_emu8000_probe(struct device *_dev)
  21. {
  22. struct snd_seq_device *dev = to_seq_dev(_dev);
  23. struct snd_emu8000 *hw;
  24. struct snd_emux *emu;
  25. hw = *(struct snd_emu8000**)SNDRV_SEQ_DEVICE_ARGPTR(dev);
  26. if (hw == NULL)
  27. return -EINVAL;
  28. if (hw->emu)
  29. return -EBUSY; /* already exists..? */
  30. if (snd_emux_new(&emu) < 0)
  31. return -ENOMEM;
  32. hw->emu = emu;
  33. snd_emu8000_ops_setup(hw);
  34. emu->hw = hw;
  35. emu->max_voices = EMU8000_DRAM_VOICES;
  36. emu->num_ports = hw->seq_ports;
  37. if (hw->memhdr) {
  38. dev_err(hw->card->dev, "memhdr is already initialized!?\n");
  39. snd_util_memhdr_free(hw->memhdr);
  40. }
  41. hw->memhdr = snd_util_memhdr_new(hw->mem_size);
  42. if (hw->memhdr == NULL) {
  43. snd_emux_free(emu);
  44. hw->emu = NULL;
  45. return -ENOMEM;
  46. }
  47. emu->memhdr = hw->memhdr;
  48. emu->midi_ports = hw->seq_ports < 2 ? hw->seq_ports : 2; /* number of virmidi ports */
  49. emu->midi_devidx = 1;
  50. emu->linear_panning = 1;
  51. emu->hwdep_idx = 2; /* FIXED */
  52. if (snd_emux_register(emu, dev->card, hw->index, "Emu8000") < 0) {
  53. snd_emux_free(emu);
  54. snd_util_memhdr_free(hw->memhdr);
  55. hw->emu = NULL;
  56. hw->memhdr = NULL;
  57. return -ENOMEM;
  58. }
  59. if (hw->mem_size > 0)
  60. snd_emu8000_pcm_new(dev->card, hw, 1);
  61. dev->driver_data = hw;
  62. return 0;
  63. }
  64. /*
  65. * free all resources
  66. */
  67. static int snd_emu8000_remove(struct device *_dev)
  68. {
  69. struct snd_seq_device *dev = to_seq_dev(_dev);
  70. struct snd_emu8000 *hw;
  71. if (dev->driver_data == NULL)
  72. return 0; /* no synth was allocated actually */
  73. hw = dev->driver_data;
  74. if (hw->pcm)
  75. snd_device_free(dev->card, hw->pcm);
  76. snd_emux_free(hw->emu);
  77. snd_util_memhdr_free(hw->memhdr);
  78. hw->emu = NULL;
  79. hw->memhdr = NULL;
  80. return 0;
  81. }
  82. /*
  83. * INIT part
  84. */
  85. static struct snd_seq_driver emu8000_driver = {
  86. .driver = {
  87. .name = KBUILD_MODNAME,
  88. .probe = snd_emu8000_probe,
  89. .remove = snd_emu8000_remove,
  90. },
  91. .id = SNDRV_SEQ_DEV_ID_EMU8000,
  92. .argsize = sizeof(struct snd_emu8000 *),
  93. };
  94. module_snd_seq_driver(emu8000_driver);