adlib.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * AdLib FM card driver.
  4. */
  5. #include <linux/kernel.h>
  6. #include <linux/module.h>
  7. #include <linux/isa.h>
  8. #include <sound/core.h>
  9. #include <sound/initval.h>
  10. #include <sound/opl3.h>
  11. #define CRD_NAME "AdLib FM"
  12. #define DEV_NAME "adlib"
  13. MODULE_DESCRIPTION(CRD_NAME);
  14. MODULE_AUTHOR("Rene Herman");
  15. MODULE_LICENSE("GPL");
  16. static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
  17. static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
  18. static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
  19. static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
  20. module_param_array(index, int, NULL, 0444);
  21. MODULE_PARM_DESC(index, "Index value for " CRD_NAME " soundcard.");
  22. module_param_array(id, charp, NULL, 0444);
  23. MODULE_PARM_DESC(id, "ID string for " CRD_NAME " soundcard.");
  24. module_param_array(enable, bool, NULL, 0444);
  25. MODULE_PARM_DESC(enable, "Enable " CRD_NAME " soundcard.");
  26. module_param_hw_array(port, long, ioport, NULL, 0444);
  27. MODULE_PARM_DESC(port, "Port # for " CRD_NAME " driver.");
  28. static int snd_adlib_match(struct device *dev, unsigned int n)
  29. {
  30. if (!enable[n])
  31. return 0;
  32. if (port[n] == SNDRV_AUTO_PORT) {
  33. dev_err(dev, "please specify port\n");
  34. return 0;
  35. }
  36. return 1;
  37. }
  38. static int snd_adlib_probe(struct device *dev, unsigned int n)
  39. {
  40. struct snd_card *card;
  41. struct snd_opl3 *opl3;
  42. int error;
  43. error = snd_devm_card_new(dev, index[n], id[n], THIS_MODULE, 0, &card);
  44. if (error < 0) {
  45. dev_err(dev, "could not create card\n");
  46. return error;
  47. }
  48. card->private_data = devm_request_region(dev, port[n], 4, CRD_NAME);
  49. if (!card->private_data) {
  50. dev_err(dev, "could not grab ports\n");
  51. return -EBUSY;
  52. }
  53. strcpy(card->driver, DEV_NAME);
  54. strcpy(card->shortname, CRD_NAME);
  55. sprintf(card->longname, CRD_NAME " at %#lx", port[n]);
  56. error = snd_opl3_create(card, port[n], port[n] + 2, OPL3_HW_AUTO, 1, &opl3);
  57. if (error < 0) {
  58. dev_err(dev, "could not create OPL\n");
  59. return error;
  60. }
  61. error = snd_opl3_hwdep_new(opl3, 0, 0, NULL);
  62. if (error < 0) {
  63. dev_err(dev, "could not create FM\n");
  64. return error;
  65. }
  66. error = snd_card_register(card);
  67. if (error < 0) {
  68. dev_err(dev, "could not register card\n");
  69. return error;
  70. }
  71. dev_set_drvdata(dev, card);
  72. return 0;
  73. }
  74. static struct isa_driver snd_adlib_driver = {
  75. .match = snd_adlib_match,
  76. .probe = snd_adlib_probe,
  77. .driver = {
  78. .name = DEV_NAME
  79. }
  80. };
  81. module_isa_driver(snd_adlib_driver, SNDRV_CARDS);