db9.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 1999-2001 Vojtech Pavlik
  4. *
  5. * Based on the work of:
  6. * Andree Borrmann Mats Sjövall
  7. */
  8. /*
  9. * Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver for Linux
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/delay.h>
  14. #include <linux/init.h>
  15. #include <linux/parport.h>
  16. #include <linux/input.h>
  17. #include <linux/mutex.h>
  18. #include <linux/slab.h>
  19. MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
  20. MODULE_DESCRIPTION("Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver");
  21. MODULE_LICENSE("GPL");
  22. struct db9_config {
  23. int args[2];
  24. unsigned int nargs;
  25. };
  26. #define DB9_MAX_PORTS 3
  27. static struct db9_config db9_cfg[DB9_MAX_PORTS];
  28. module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0);
  29. MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)");
  30. module_param_array_named(dev2, db9_cfg[1].args, int, &db9_cfg[1].nargs, 0);
  31. MODULE_PARM_DESC(dev2, "Describes second attached device (<parport#>,<type>)");
  32. module_param_array_named(dev3, db9_cfg[2].args, int, &db9_cfg[2].nargs, 0);
  33. MODULE_PARM_DESC(dev3, "Describes third attached device (<parport#>,<type>)");
  34. #define DB9_ARG_PARPORT 0
  35. #define DB9_ARG_MODE 1
  36. #define DB9_MULTI_STICK 0x01
  37. #define DB9_MULTI2_STICK 0x02
  38. #define DB9_GENESIS_PAD 0x03
  39. #define DB9_GENESIS5_PAD 0x05
  40. #define DB9_GENESIS6_PAD 0x06
  41. #define DB9_SATURN_PAD 0x07
  42. #define DB9_MULTI_0802 0x08
  43. #define DB9_MULTI_0802_2 0x09
  44. #define DB9_CD32_PAD 0x0A
  45. #define DB9_SATURN_DPP 0x0B
  46. #define DB9_SATURN_DPP_2 0x0C
  47. #define DB9_MAX_PAD 0x0D
  48. #define DB9_UP 0x01
  49. #define DB9_DOWN 0x02
  50. #define DB9_LEFT 0x04
  51. #define DB9_RIGHT 0x08
  52. #define DB9_FIRE1 0x10
  53. #define DB9_FIRE2 0x20
  54. #define DB9_FIRE3 0x40
  55. #define DB9_FIRE4 0x80
  56. #define DB9_NORMAL 0x0a
  57. #define DB9_NOSELECT 0x08
  58. #define DB9_GENESIS6_DELAY 14
  59. #define DB9_REFRESH_TIME HZ/100
  60. #define DB9_MAX_DEVICES 2
  61. struct db9_mode_data {
  62. const char *name;
  63. const short *buttons;
  64. int n_buttons;
  65. int n_pads;
  66. int n_axis;
  67. int bidirectional;
  68. int reverse;
  69. };
  70. struct db9 {
  71. struct input_dev *dev[DB9_MAX_DEVICES];
  72. struct timer_list timer;
  73. struct pardevice *pd;
  74. int mode;
  75. int used;
  76. int parportno;
  77. struct mutex mutex;
  78. char phys[DB9_MAX_DEVICES][32];
  79. };
  80. static struct db9 *db9_base[3];
  81. static const short db9_multi_btn[] = { BTN_TRIGGER, BTN_THUMB };
  82. static const short db9_genesis_btn[] = { BTN_START, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_MODE };
  83. static const short db9_cd32_btn[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_START };
  84. static const short db9_abs[] = { ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_RZ, ABS_Z, ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y };
  85. static const struct db9_mode_data db9_modes[] = {
  86. { NULL, NULL, 0, 0, 0, 0, 0 },
  87. { "Multisystem joystick", db9_multi_btn, 1, 1, 2, 1, 1 },
  88. { "Multisystem joystick (2 fire)", db9_multi_btn, 2, 1, 2, 1, 1 },
  89. { "Genesis pad", db9_genesis_btn, 4, 1, 2, 1, 1 },
  90. { NULL, NULL, 0, 0, 0, 0, 0 },
  91. { "Genesis 5 pad", db9_genesis_btn, 6, 1, 2, 1, 1 },
  92. { "Genesis 6 pad", db9_genesis_btn, 8, 1, 2, 1, 1 },
  93. { "Saturn pad", db9_cd32_btn, 9, 6, 7, 0, 1 },
  94. { "Multisystem (0.8.0.2) joystick", db9_multi_btn, 1, 1, 2, 1, 1 },
  95. { "Multisystem (0.8.0.2-dual) joystick", db9_multi_btn, 1, 2, 2, 1, 1 },
  96. { "Amiga CD-32 pad", db9_cd32_btn, 7, 1, 2, 1, 1 },
  97. { "Saturn dpp", db9_cd32_btn, 9, 6, 7, 0, 0 },
  98. { "Saturn dpp dual", db9_cd32_btn, 9, 12, 7, 0, 0 },
  99. };
  100. /*
  101. * Saturn controllers
  102. */
  103. #define DB9_SATURN_DELAY 300
  104. static const int db9_saturn_byte[] = { 1, 1, 1, 2, 2, 2, 2, 2, 1 };
  105. static const unsigned char db9_saturn_mask[] = { 0x04, 0x01, 0x02, 0x40, 0x20, 0x10, 0x08, 0x80, 0x08 };
  106. /*
  107. * db9_saturn_write_sub() writes 2 bit data.
  108. */
  109. static void db9_saturn_write_sub(struct parport *port, int type, unsigned char data, int powered, int pwr_sub)
  110. {
  111. unsigned char c;
  112. switch (type) {
  113. case 1: /* DPP1 */
  114. c = 0x80 | 0x30 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) | data;
  115. parport_write_data(port, c);
  116. break;
  117. case 2: /* DPP2 */
  118. c = 0x40 | data << 4 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) | 0x03;
  119. parport_write_data(port, c);
  120. break;
  121. case 0: /* DB9 */
  122. c = ((((data & 2) ? 2 : 0) | ((data & 1) ? 4 : 0)) ^ 0x02) | !powered;
  123. parport_write_control(port, c);
  124. break;
  125. }
  126. }
  127. /*
  128. * gc_saturn_read_sub() reads 4 bit data.
  129. */
  130. static unsigned char db9_saturn_read_sub(struct parport *port, int type)
  131. {
  132. unsigned char data;
  133. if (type) {
  134. /* DPP */
  135. data = parport_read_status(port) ^ 0x80;
  136. return (data & 0x80 ? 1 : 0) | (data & 0x40 ? 2 : 0)
  137. | (data & 0x20 ? 4 : 0) | (data & 0x10 ? 8 : 0);
  138. } else {
  139. /* DB9 */
  140. data = parport_read_data(port) & 0x0f;
  141. return (data & 0x8 ? 1 : 0) | (data & 0x4 ? 2 : 0)
  142. | (data & 0x2 ? 4 : 0) | (data & 0x1 ? 8 : 0);
  143. }
  144. }
  145. /*
  146. * db9_saturn_read_analog() sends clock and reads 8 bit data.
  147. */
  148. static unsigned char db9_saturn_read_analog(struct parport *port, int type, int powered)
  149. {
  150. unsigned char data;
  151. db9_saturn_write_sub(port, type, 0, powered, 0);
  152. udelay(DB9_SATURN_DELAY);
  153. data = db9_saturn_read_sub(port, type) << 4;
  154. db9_saturn_write_sub(port, type, 2, powered, 0);
  155. udelay(DB9_SATURN_DELAY);
  156. data |= db9_saturn_read_sub(port, type);
  157. return data;
  158. }
  159. /*
  160. * db9_saturn_read_packet() reads whole saturn packet at connector
  161. * and returns device identifier code.
  162. */
  163. static unsigned char db9_saturn_read_packet(struct parport *port, unsigned char *data, int type, int powered)
  164. {
  165. int i, j;
  166. unsigned char tmp;
  167. db9_saturn_write_sub(port, type, 3, powered, 0);
  168. data[0] = db9_saturn_read_sub(port, type);
  169. switch (data[0] & 0x0f) {
  170. case 0xf:
  171. /* 1111 no pad */
  172. return data[0] = 0xff;
  173. case 0x4: case 0x4 | 0x8:
  174. /* ?100 : digital controller */
  175. db9_saturn_write_sub(port, type, 0, powered, 1);
  176. data[2] = db9_saturn_read_sub(port, type) << 4;
  177. db9_saturn_write_sub(port, type, 2, powered, 1);
  178. data[1] = db9_saturn_read_sub(port, type) << 4;
  179. db9_saturn_write_sub(port, type, 1, powered, 1);
  180. data[1] |= db9_saturn_read_sub(port, type);
  181. db9_saturn_write_sub(port, type, 3, powered, 1);
  182. /* data[2] |= db9_saturn_read_sub(port, type); */
  183. data[2] |= data[0];
  184. return data[0] = 0x02;
  185. case 0x1:
  186. /* 0001 : analog controller or multitap */
  187. db9_saturn_write_sub(port, type, 2, powered, 0);
  188. udelay(DB9_SATURN_DELAY);
  189. data[0] = db9_saturn_read_analog(port, type, powered);
  190. if (data[0] != 0x41) {
  191. /* read analog controller */
  192. for (i = 0; i < (data[0] & 0x0f); i++)
  193. data[i + 1] = db9_saturn_read_analog(port, type, powered);
  194. db9_saturn_write_sub(port, type, 3, powered, 0);
  195. return data[0];
  196. } else {
  197. /* read multitap */
  198. if (db9_saturn_read_analog(port, type, powered) != 0x60)
  199. return data[0] = 0xff;
  200. for (i = 0; i < 60; i += 10) {
  201. data[i] = db9_saturn_read_analog(port, type, powered);
  202. if (data[i] != 0xff)
  203. /* read each pad */
  204. for (j = 0; j < (data[i] & 0x0f); j++)
  205. data[i + j + 1] = db9_saturn_read_analog(port, type, powered);
  206. }
  207. db9_saturn_write_sub(port, type, 3, powered, 0);
  208. return 0x41;
  209. }
  210. case 0x0:
  211. /* 0000 : mouse */
  212. db9_saturn_write_sub(port, type, 2, powered, 0);
  213. udelay(DB9_SATURN_DELAY);
  214. tmp = db9_saturn_read_analog(port, type, powered);
  215. if (tmp == 0xff) {
  216. for (i = 0; i < 3; i++)
  217. data[i + 1] = db9_saturn_read_analog(port, type, powered);
  218. db9_saturn_write_sub(port, type, 3, powered, 0);
  219. return data[0] = 0xe3;
  220. }
  221. fallthrough;
  222. default:
  223. return data[0];
  224. }
  225. }
  226. /*
  227. * db9_saturn_report() analyzes packet and reports.
  228. */
  229. static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *devs[], int n, int max_pads)
  230. {
  231. struct input_dev *dev;
  232. int tmp, i, j;
  233. tmp = (id == 0x41) ? 60 : 10;
  234. for (j = 0; j < tmp && n < max_pads; j += 10, n++) {
  235. dev = devs[n];
  236. switch (data[j]) {
  237. case 0x16: /* multi controller (analog 4 axis) */
  238. input_report_abs(dev, db9_abs[5], data[j + 6]);
  239. fallthrough;
  240. case 0x15: /* mission stick (analog 3 axis) */
  241. input_report_abs(dev, db9_abs[3], data[j + 4]);
  242. input_report_abs(dev, db9_abs[4], data[j + 5]);
  243. fallthrough;
  244. case 0x13: /* racing controller (analog 1 axis) */
  245. input_report_abs(dev, db9_abs[2], data[j + 3]);
  246. fallthrough;
  247. case 0x34: /* saturn keyboard (udlr ZXC ASD QE Esc) */
  248. case 0x02: /* digital pad (digital 2 axis + buttons) */
  249. input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));
  250. input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));
  251. for (i = 0; i < 9; i++)
  252. input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);
  253. break;
  254. case 0x19: /* mission stick x2 (analog 6 axis + buttons) */
  255. input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));
  256. input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));
  257. for (i = 0; i < 9; i++)
  258. input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);
  259. input_report_abs(dev, db9_abs[2], data[j + 3]);
  260. input_report_abs(dev, db9_abs[3], data[j + 4]);
  261. input_report_abs(dev, db9_abs[4], data[j + 5]);
  262. /*
  263. input_report_abs(dev, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1));
  264. input_report_abs(dev, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1));
  265. */
  266. input_report_abs(dev, db9_abs[6], data[j + 7]);
  267. input_report_abs(dev, db9_abs[7], data[j + 8]);
  268. input_report_abs(dev, db9_abs[5], data[j + 9]);
  269. break;
  270. case 0xd3: /* sankyo ff (analog 1 axis + stop btn) */
  271. input_report_key(dev, BTN_A, data[j + 3] & 0x80);
  272. input_report_abs(dev, db9_abs[2], data[j + 3] & 0x7f);
  273. break;
  274. case 0xe3: /* shuttle mouse (analog 2 axis + buttons. signed value) */
  275. input_report_key(dev, BTN_START, data[j + 1] & 0x08);
  276. input_report_key(dev, BTN_A, data[j + 1] & 0x04);
  277. input_report_key(dev, BTN_C, data[j + 1] & 0x02);
  278. input_report_key(dev, BTN_B, data[j + 1] & 0x01);
  279. input_report_abs(dev, db9_abs[2], data[j + 2] ^ 0x80);
  280. input_report_abs(dev, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */
  281. break;
  282. case 0xff:
  283. default: /* no pad */
  284. input_report_abs(dev, db9_abs[0], 0);
  285. input_report_abs(dev, db9_abs[1], 0);
  286. for (i = 0; i < 9; i++)
  287. input_report_key(dev, db9_cd32_btn[i], 0);
  288. break;
  289. }
  290. }
  291. return n;
  292. }
  293. static int db9_saturn(int mode, struct parport *port, struct input_dev *devs[])
  294. {
  295. unsigned char id, data[60];
  296. int type, n, max_pads;
  297. int tmp, i;
  298. switch (mode) {
  299. case DB9_SATURN_PAD:
  300. type = 0;
  301. n = 1;
  302. break;
  303. case DB9_SATURN_DPP:
  304. type = 1;
  305. n = 1;
  306. break;
  307. case DB9_SATURN_DPP_2:
  308. type = 1;
  309. n = 2;
  310. break;
  311. default:
  312. return -1;
  313. }
  314. max_pads = min(db9_modes[mode].n_pads, DB9_MAX_DEVICES);
  315. for (tmp = 0, i = 0; i < n; i++) {
  316. id = db9_saturn_read_packet(port, data, type + i, 1);
  317. tmp = db9_saturn_report(id, data, devs, tmp, max_pads);
  318. }
  319. return 0;
  320. }
  321. static void db9_timer(struct timer_list *t)
  322. {
  323. struct db9 *db9 = timer_container_of(db9, t, timer);
  324. struct parport *port = db9->pd->port;
  325. struct input_dev *dev = db9->dev[0];
  326. struct input_dev *dev2 = db9->dev[1];
  327. int data, i;
  328. switch (db9->mode) {
  329. case DB9_MULTI_0802_2:
  330. data = parport_read_data(port) >> 3;
  331. input_report_abs(dev2, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  332. input_report_abs(dev2, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  333. input_report_key(dev2, BTN_TRIGGER, ~data & DB9_FIRE1);
  334. fallthrough;
  335. case DB9_MULTI_0802:
  336. data = parport_read_status(port) >> 3;
  337. input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  338. input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  339. input_report_key(dev, BTN_TRIGGER, data & DB9_FIRE1);
  340. break;
  341. case DB9_MULTI_STICK:
  342. data = parport_read_data(port);
  343. input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  344. input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  345. input_report_key(dev, BTN_TRIGGER, ~data & DB9_FIRE1);
  346. break;
  347. case DB9_MULTI2_STICK:
  348. data = parport_read_data(port);
  349. input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  350. input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  351. input_report_key(dev, BTN_TRIGGER, ~data & DB9_FIRE1);
  352. input_report_key(dev, BTN_THUMB, ~data & DB9_FIRE2);
  353. break;
  354. case DB9_GENESIS_PAD:
  355. parport_write_control(port, DB9_NOSELECT);
  356. data = parport_read_data(port);
  357. input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  358. input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  359. input_report_key(dev, BTN_B, ~data & DB9_FIRE1);
  360. input_report_key(dev, BTN_C, ~data & DB9_FIRE2);
  361. parport_write_control(port, DB9_NORMAL);
  362. data = parport_read_data(port);
  363. input_report_key(dev, BTN_A, ~data & DB9_FIRE1);
  364. input_report_key(dev, BTN_START, ~data & DB9_FIRE2);
  365. break;
  366. case DB9_GENESIS5_PAD:
  367. parport_write_control(port, DB9_NOSELECT);
  368. data = parport_read_data(port);
  369. input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  370. input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  371. input_report_key(dev, BTN_B, ~data & DB9_FIRE1);
  372. input_report_key(dev, BTN_C, ~data & DB9_FIRE2);
  373. parport_write_control(port, DB9_NORMAL);
  374. data = parport_read_data(port);
  375. input_report_key(dev, BTN_A, ~data & DB9_FIRE1);
  376. input_report_key(dev, BTN_X, ~data & DB9_FIRE2);
  377. input_report_key(dev, BTN_Y, ~data & DB9_LEFT);
  378. input_report_key(dev, BTN_START, ~data & DB9_RIGHT);
  379. break;
  380. case DB9_GENESIS6_PAD:
  381. parport_write_control(port, DB9_NOSELECT); /* 1 */
  382. udelay(DB9_GENESIS6_DELAY);
  383. data = parport_read_data(port);
  384. input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  385. input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  386. input_report_key(dev, BTN_B, ~data & DB9_FIRE1);
  387. input_report_key(dev, BTN_C, ~data & DB9_FIRE2);
  388. parport_write_control(port, DB9_NORMAL);
  389. udelay(DB9_GENESIS6_DELAY);
  390. data = parport_read_data(port);
  391. input_report_key(dev, BTN_A, ~data & DB9_FIRE1);
  392. input_report_key(dev, BTN_START, ~data & DB9_FIRE2);
  393. parport_write_control(port, DB9_NOSELECT); /* 2 */
  394. udelay(DB9_GENESIS6_DELAY);
  395. parport_write_control(port, DB9_NORMAL);
  396. udelay(DB9_GENESIS6_DELAY);
  397. parport_write_control(port, DB9_NOSELECT); /* 3 */
  398. udelay(DB9_GENESIS6_DELAY);
  399. data=parport_read_data(port);
  400. input_report_key(dev, BTN_X, ~data & DB9_LEFT);
  401. input_report_key(dev, BTN_Y, ~data & DB9_DOWN);
  402. input_report_key(dev, BTN_Z, ~data & DB9_UP);
  403. input_report_key(dev, BTN_MODE, ~data & DB9_RIGHT);
  404. parport_write_control(port, DB9_NORMAL);
  405. udelay(DB9_GENESIS6_DELAY);
  406. parport_write_control(port, DB9_NOSELECT); /* 4 */
  407. udelay(DB9_GENESIS6_DELAY);
  408. parport_write_control(port, DB9_NORMAL);
  409. break;
  410. case DB9_SATURN_PAD:
  411. case DB9_SATURN_DPP:
  412. case DB9_SATURN_DPP_2:
  413. db9_saturn(db9->mode, port, db9->dev);
  414. break;
  415. case DB9_CD32_PAD:
  416. data = parport_read_data(port);
  417. input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
  418. input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
  419. parport_write_control(port, 0x0a);
  420. for (i = 0; i < 7; i++) {
  421. data = parport_read_data(port);
  422. parport_write_control(port, 0x02);
  423. parport_write_control(port, 0x0a);
  424. input_report_key(dev, db9_cd32_btn[i], ~data & DB9_FIRE2);
  425. }
  426. parport_write_control(port, 0x00);
  427. break;
  428. }
  429. input_sync(dev);
  430. mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME);
  431. }
  432. static int db9_open(struct input_dev *dev)
  433. {
  434. struct db9 *db9 = input_get_drvdata(dev);
  435. struct parport *port = db9->pd->port;
  436. scoped_guard(mutex_intr, &db9->mutex) {
  437. if (!db9->used++) {
  438. parport_claim(db9->pd);
  439. parport_write_data(port, 0xff);
  440. if (db9_modes[db9->mode].reverse) {
  441. parport_data_reverse(port);
  442. parport_write_control(port, DB9_NORMAL);
  443. }
  444. mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME);
  445. }
  446. return 0;
  447. }
  448. return -EINTR;
  449. }
  450. static void db9_close(struct input_dev *dev)
  451. {
  452. struct db9 *db9 = input_get_drvdata(dev);
  453. struct parport *port = db9->pd->port;
  454. guard(mutex)(&db9->mutex);
  455. if (!--db9->used) {
  456. timer_delete_sync(&db9->timer);
  457. parport_write_control(port, 0x00);
  458. parport_data_forward(port);
  459. parport_release(db9->pd);
  460. }
  461. }
  462. static void db9_attach(struct parport *pp)
  463. {
  464. struct db9 *db9;
  465. const struct db9_mode_data *db9_mode;
  466. struct pardevice *pd;
  467. struct input_dev *input_dev;
  468. int i, j, port_idx;
  469. int mode;
  470. struct pardev_cb db9_parport_cb;
  471. for (port_idx = 0; port_idx < DB9_MAX_PORTS; port_idx++) {
  472. if (db9_cfg[port_idx].nargs == 0 ||
  473. db9_cfg[port_idx].args[DB9_ARG_PARPORT] < 0)
  474. continue;
  475. if (db9_cfg[port_idx].args[DB9_ARG_PARPORT] == pp->number)
  476. break;
  477. }
  478. if (port_idx == DB9_MAX_PORTS) {
  479. pr_debug("Not using parport%d.\n", pp->number);
  480. return;
  481. }
  482. mode = db9_cfg[port_idx].args[DB9_ARG_MODE];
  483. if (mode < 1 || mode >= DB9_MAX_PAD || !db9_modes[mode].n_buttons) {
  484. printk(KERN_ERR "db9.c: Bad device type %d\n", mode);
  485. return;
  486. }
  487. db9_mode = &db9_modes[mode];
  488. if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) {
  489. printk(KERN_ERR "db9.c: specified parport is not bidirectional\n");
  490. return;
  491. }
  492. memset(&db9_parport_cb, 0, sizeof(db9_parport_cb));
  493. db9_parport_cb.flags = PARPORT_FLAG_EXCL;
  494. pd = parport_register_dev_model(pp, "db9", &db9_parport_cb, port_idx);
  495. if (!pd) {
  496. printk(KERN_ERR "db9.c: parport busy already - lp.o loaded?\n");
  497. return;
  498. }
  499. db9 = kzalloc_obj(*db9);
  500. if (!db9)
  501. goto err_unreg_pardev;
  502. mutex_init(&db9->mutex);
  503. db9->pd = pd;
  504. db9->mode = mode;
  505. db9->parportno = pp->number;
  506. timer_setup(&db9->timer, db9_timer, 0);
  507. for (i = 0; i < (min(db9_mode->n_pads, DB9_MAX_DEVICES)); i++) {
  508. db9->dev[i] = input_dev = input_allocate_device();
  509. if (!input_dev) {
  510. printk(KERN_ERR "db9.c: Not enough memory for input device\n");
  511. goto err_unreg_devs;
  512. }
  513. snprintf(db9->phys[i], sizeof(db9->phys[i]),
  514. "%s/input%d", db9->pd->port->name, i);
  515. input_dev->name = db9_mode->name;
  516. input_dev->phys = db9->phys[i];
  517. input_dev->id.bustype = BUS_PARPORT;
  518. input_dev->id.vendor = 0x0002;
  519. input_dev->id.product = mode;
  520. input_dev->id.version = 0x0100;
  521. input_set_drvdata(input_dev, db9);
  522. input_dev->open = db9_open;
  523. input_dev->close = db9_close;
  524. input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
  525. for (j = 0; j < db9_mode->n_buttons; j++)
  526. set_bit(db9_mode->buttons[j], input_dev->keybit);
  527. for (j = 0; j < db9_mode->n_axis; j++) {
  528. if (j < 2)
  529. input_set_abs_params(input_dev, db9_abs[j], -1, 1, 0, 0);
  530. else
  531. input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0);
  532. }
  533. if (input_register_device(input_dev))
  534. goto err_free_dev;
  535. }
  536. db9_base[port_idx] = db9;
  537. return;
  538. err_free_dev:
  539. input_free_device(db9->dev[i]);
  540. err_unreg_devs:
  541. while (--i >= 0)
  542. input_unregister_device(db9->dev[i]);
  543. kfree(db9);
  544. err_unreg_pardev:
  545. parport_unregister_device(pd);
  546. }
  547. static void db9_detach(struct parport *port)
  548. {
  549. int i;
  550. struct db9 *db9;
  551. for (i = 0; i < DB9_MAX_PORTS; i++) {
  552. if (db9_base[i] && db9_base[i]->parportno == port->number)
  553. break;
  554. }
  555. if (i == DB9_MAX_PORTS)
  556. return;
  557. db9 = db9_base[i];
  558. db9_base[i] = NULL;
  559. for (i = 0; i < min(db9_modes[db9->mode].n_pads, DB9_MAX_DEVICES); i++)
  560. input_unregister_device(db9->dev[i]);
  561. parport_unregister_device(db9->pd);
  562. kfree(db9);
  563. }
  564. static struct parport_driver db9_parport_driver = {
  565. .name = "db9",
  566. .match_port = db9_attach,
  567. .detach = db9_detach,
  568. };
  569. static int __init db9_init(void)
  570. {
  571. int i;
  572. int have_dev = 0;
  573. for (i = 0; i < DB9_MAX_PORTS; i++) {
  574. if (db9_cfg[i].nargs == 0 || db9_cfg[i].args[DB9_ARG_PARPORT] < 0)
  575. continue;
  576. if (db9_cfg[i].nargs < 2) {
  577. printk(KERN_ERR "db9.c: Device type must be specified.\n");
  578. return -EINVAL;
  579. }
  580. have_dev = 1;
  581. }
  582. if (!have_dev)
  583. return -ENODEV;
  584. return parport_register_driver(&db9_parport_driver);
  585. }
  586. static void __exit db9_exit(void)
  587. {
  588. parport_unregister_driver(&db9_parport_driver);
  589. }
  590. module_init(db9_init);
  591. module_exit(db9_exit);