au88x0_game.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Manuel Jander.
  4. *
  5. * Based on the work of:
  6. * Vojtech Pavlik
  7. * Raymond Ingles
  8. *
  9. * Should you need to contact me, the author, you can do so either by
  10. * e-mail - mail your message to <[email protected]>, or by paper mail:
  11. * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
  12. *
  13. * Based 90% on Vojtech Pavlik pcigame driver.
  14. * Merged and modified by Manuel Jander, for the OpenVortex
  15. * driver. (email: [email protected]).
  16. */
  17. #include <linux/time.h>
  18. #include <linux/delay.h>
  19. #include <linux/init.h>
  20. #include <sound/core.h>
  21. #include "au88x0.h"
  22. #include <linux/gameport.h>
  23. #include <linux/export.h>
  24. #if IS_REACHABLE(CONFIG_GAMEPORT)
  25. #define VORTEX_GAME_DWAIT 20 /* 20 ms */
  26. static unsigned char vortex_game_read(struct gameport *gameport)
  27. {
  28. vortex_t *vortex = gameport_get_port_data(gameport);
  29. return hwread(vortex->mmio, VORTEX_GAME_LEGACY);
  30. }
  31. static void vortex_game_trigger(struct gameport *gameport)
  32. {
  33. vortex_t *vortex = gameport_get_port_data(gameport);
  34. hwwrite(vortex->mmio, VORTEX_GAME_LEGACY, 0xff);
  35. }
  36. static int
  37. vortex_game_cooked_read(struct gameport *gameport, int *axes, int *buttons)
  38. {
  39. vortex_t *vortex = gameport_get_port_data(gameport);
  40. int i;
  41. *buttons = (~hwread(vortex->mmio, VORTEX_GAME_LEGACY) >> 4) & 0xf;
  42. for (i = 0; i < 4; i++) {
  43. axes[i] =
  44. hwread(vortex->mmio, VORTEX_GAME_AXIS + (i * AXIS_SIZE));
  45. if (axes[i] == AXIS_RANGE)
  46. axes[i] = -1;
  47. }
  48. return 0;
  49. }
  50. static int vortex_game_open(struct gameport *gameport, int mode)
  51. {
  52. vortex_t *vortex = gameport_get_port_data(gameport);
  53. switch (mode) {
  54. case GAMEPORT_MODE_COOKED:
  55. hwwrite(vortex->mmio, VORTEX_CTRL2,
  56. hwread(vortex->mmio,
  57. VORTEX_CTRL2) | CTRL2_GAME_ADCMODE);
  58. msleep(VORTEX_GAME_DWAIT);
  59. return 0;
  60. case GAMEPORT_MODE_RAW:
  61. hwwrite(vortex->mmio, VORTEX_CTRL2,
  62. hwread(vortex->mmio,
  63. VORTEX_CTRL2) & ~CTRL2_GAME_ADCMODE);
  64. return 0;
  65. default:
  66. return -1;
  67. }
  68. return 0;
  69. }
  70. static int vortex_gameport_register(vortex_t *vortex)
  71. {
  72. struct gameport *gp;
  73. vortex->gameport = gp = gameport_allocate_port();
  74. if (!gp) {
  75. dev_err(vortex->card->dev,
  76. "cannot allocate memory for gameport\n");
  77. return -ENOMEM;
  78. }
  79. gameport_set_name(gp, "AU88x0 Gameport");
  80. gameport_set_phys(gp, "pci%s/gameport0", pci_name(vortex->pci_dev));
  81. gameport_set_dev_parent(gp, &vortex->pci_dev->dev);
  82. gp->read = vortex_game_read;
  83. gp->trigger = vortex_game_trigger;
  84. gp->cooked_read = vortex_game_cooked_read;
  85. gp->open = vortex_game_open;
  86. gameport_set_port_data(gp, vortex);
  87. gp->fuzz = 64;
  88. gameport_register_port(gp);
  89. return 0;
  90. }
  91. static void vortex_gameport_unregister(vortex_t * vortex)
  92. {
  93. if (vortex->gameport) {
  94. gameport_unregister_port(vortex->gameport);
  95. vortex->gameport = NULL;
  96. }
  97. }
  98. #else
  99. static inline int vortex_gameport_register(vortex_t * vortex) { return -ENOSYS; }
  100. static inline void vortex_gameport_unregister(vortex_t * vortex) { }
  101. #endif