parport_serial.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. /*
  2. * Support for common PCI multi-I/O cards (which is most of them)
  3. *
  4. * Copyright (C) 2001 Tim Waugh <twaugh@redhat.com>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. *
  11. *
  12. * Multi-function PCI cards are supposed to present separate logical
  13. * devices on the bus. A common thing to do seems to be to just use
  14. * one logical device with lots of base address registers for both
  15. * parallel ports and serial ports. This driver is for dealing with
  16. * that.
  17. *
  18. */
  19. #include <linux/types.h>
  20. #include <linux/module.h>
  21. #include <linux/init.h>
  22. #include <linux/pci.h>
  23. #include <linux/parport.h>
  24. #include <linux/parport_pc.h>
  25. #include <linux/8250_pci.h>
  26. enum parport_pc_pci_cards {
  27. titan_110l = 0,
  28. titan_210l,
  29. netmos_9xx5_combo,
  30. netmos_9855,
  31. avlab_1s1p,
  32. avlab_1s1p_650,
  33. avlab_1s1p_850,
  34. avlab_1s2p,
  35. avlab_1s2p_650,
  36. avlab_1s2p_850,
  37. avlab_2s1p,
  38. avlab_2s1p_650,
  39. avlab_2s1p_850,
  40. siig_1s1p_10x,
  41. siig_2s1p_10x,
  42. siig_2p1s_20x,
  43. siig_1s1p_20x,
  44. siig_2s1p_20x,
  45. };
  46. /* each element directly indexed from enum list, above */
  47. struct parport_pc_pci {
  48. int numports;
  49. struct { /* BAR (base address registers) numbers in the config
  50. space header */
  51. int lo;
  52. int hi; /* -1 if not there, >6 for offset-method (max
  53. BAR is 6) */
  54. } addr[4];
  55. /* If set, this is called immediately after pci_enable_device.
  56. * If it returns non-zero, no probing will take place and the
  57. * ports will not be used. */
  58. int (*preinit_hook) (struct pci_dev *pdev, struct parport_pc_pci *card,
  59. int autoirq, int autodma);
  60. /* If set, this is called after probing for ports. If 'failed'
  61. * is non-zero we couldn't use any of the ports. */
  62. void (*postinit_hook) (struct pci_dev *pdev,
  63. struct parport_pc_pci *card, int failed);
  64. };
  65. static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *card, int autoirq, int autodma)
  66. {
  67. /*
  68. * Netmos uses the subdevice ID to indicate the number of parallel
  69. * and serial ports. The form is 0x00PS, where <P> is the number of
  70. * parallel ports and <S> is the number of serial ports.
  71. */
  72. card->numports = (dev->subsystem_device & 0xf0) >> 4;
  73. return 0;
  74. }
  75. static struct parport_pc_pci cards[] __devinitdata = {
  76. /* titan_110l */ { 1, { { 3, -1 }, } },
  77. /* titan_210l */ { 1, { { 3, -1 }, } },
  78. /* netmos_9xx5_combo */ { 1, { { 2, -1 }, }, netmos_parallel_init },
  79. /* netmos_9855 */ { 1, { { 0, -1 }, }, netmos_parallel_init },
  80. /* avlab_1s1p */ { 1, { { 1, 2}, } },
  81. /* avlab_1s1p_650 */ { 1, { { 1, 2}, } },
  82. /* avlab_1s1p_850 */ { 1, { { 1, 2}, } },
  83. /* avlab_1s2p */ { 2, { { 1, 2}, { 3, 4 },} },
  84. /* avlab_1s2p_650 */ { 2, { { 1, 2}, { 3, 4 },} },
  85. /* avlab_1s2p_850 */ { 2, { { 1, 2}, { 3, 4 },} },
  86. /* avlab_2s1p */ { 1, { { 2, 3}, } },
  87. /* avlab_2s1p_650 */ { 1, { { 2, 3}, } },
  88. /* avlab_2s1p_850 */ { 1, { { 2, 3}, } },
  89. /* siig_1s1p_10x */ { 1, { { 3, 4 }, } },
  90. /* siig_2s1p_10x */ { 1, { { 4, 5 }, } },
  91. /* siig_2p1s_20x */ { 2, { { 1, 2 }, { 3, 4 }, } },
  92. /* siig_1s1p_20x */ { 1, { { 1, 2 }, } },
  93. /* siig_2s1p_20x */ { 1, { { 2, 3 }, } },
  94. };
  95. static struct pci_device_id parport_serial_pci_tbl[] = {
  96. /* PCI cards */
  97. { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_110L,
  98. PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_110l },
  99. { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_210L,
  100. PCI_ANY_ID, PCI_ANY_ID, 0, 0, titan_210l },
  101. { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9735,
  102. PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
  103. { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9745,
  104. PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
  105. { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
  106. PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
  107. { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
  108. PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
  109. { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9845,
  110. PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
  111. { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
  112. PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9855 },
  113. /* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/
  114. { 0x14db, 0x2110, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p},
  115. { 0x14db, 0x2111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p_650},
  116. { 0x14db, 0x2112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p_850},
  117. { 0x14db, 0x2140, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p},
  118. { 0x14db, 0x2141, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p_650},
  119. { 0x14db, 0x2142, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s2p_850},
  120. { 0x14db, 0x2160, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p},
  121. { 0x14db, 0x2161, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p_650},
  122. { 0x14db, 0x2162, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_2s1p_850},
  123. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550,
  124. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x },
  125. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650,
  126. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x },
  127. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850,
  128. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x },
  129. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550,
  130. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x },
  131. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650,
  132. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x },
  133. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850,
  134. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x },
  135. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550,
  136. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x },
  137. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650,
  138. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x },
  139. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850,
  140. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x },
  141. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550,
  142. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
  143. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650,
  144. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x },
  145. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850,
  146. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x },
  147. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550,
  148. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
  149. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650,
  150. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
  151. { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850,
  152. PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
  153. { 0, } /* terminate list */
  154. };
  155. MODULE_DEVICE_TABLE(pci,parport_serial_pci_tbl);
  156. /*
  157. * This table describes the serial "geometry" of these boards. Any
  158. * quirks for these can be found in drivers/serial/8250_pci.c
  159. *
  160. * Cards not tested are marked n/t
  161. * If you have one of these cards and it works for you, please tell me..
  162. */
  163. static struct pciserial_board pci_parport_serial_boards[] __devinitdata = {
  164. [titan_110l] = {
  165. .flags = FL_BASE1 | FL_BASE_BARS,
  166. .num_ports = 1,
  167. .base_baud = 921600,
  168. .uart_offset = 8,
  169. },
  170. [titan_210l] = {
  171. .flags = FL_BASE1 | FL_BASE_BARS,
  172. .num_ports = 2,
  173. .base_baud = 921600,
  174. .uart_offset = 8,
  175. },
  176. [netmos_9xx5_combo] = {
  177. .flags = FL_BASE0 | FL_BASE_BARS,
  178. .num_ports = 1,
  179. .base_baud = 115200,
  180. .uart_offset = 8,
  181. },
  182. [netmos_9855] = {
  183. .flags = FL_BASE2 | FL_BASE_BARS,
  184. .num_ports = 1,
  185. .base_baud = 115200,
  186. .uart_offset = 8,
  187. },
  188. [avlab_1s1p] = { /* n/t */
  189. .flags = FL_BASE0 | FL_BASE_BARS,
  190. .num_ports = 1,
  191. .base_baud = 115200,
  192. .uart_offset = 8,
  193. },
  194. [avlab_1s1p_650] = { /* nt */
  195. .flags = FL_BASE0 | FL_BASE_BARS,
  196. .num_ports = 1,
  197. .base_baud = 115200,
  198. .uart_offset = 8,
  199. },
  200. [avlab_1s1p_850] = { /* nt */
  201. .flags = FL_BASE0 | FL_BASE_BARS,
  202. .num_ports = 1,
  203. .base_baud = 115200,
  204. .uart_offset = 8,
  205. },
  206. [avlab_1s2p] = { /* n/t */
  207. .flags = FL_BASE0 | FL_BASE_BARS,
  208. .num_ports = 1,
  209. .base_baud = 115200,
  210. .uart_offset = 8,
  211. },
  212. [avlab_1s2p_650] = { /* nt */
  213. .flags = FL_BASE0 | FL_BASE_BARS,
  214. .num_ports = 1,
  215. .base_baud = 115200,
  216. .uart_offset = 8,
  217. },
  218. [avlab_1s2p_850] = { /* nt */
  219. .flags = FL_BASE0 | FL_BASE_BARS,
  220. .num_ports = 1,
  221. .base_baud = 115200,
  222. .uart_offset = 8,
  223. },
  224. [avlab_2s1p] = { /* n/t */
  225. .flags = FL_BASE0 | FL_BASE_BARS,
  226. .num_ports = 2,
  227. .base_baud = 115200,
  228. .uart_offset = 8,
  229. },
  230. [avlab_2s1p_650] = { /* nt */
  231. .flags = FL_BASE0 | FL_BASE_BARS,
  232. .num_ports = 2,
  233. .base_baud = 115200,
  234. .uart_offset = 8,
  235. },
  236. [avlab_2s1p_850] = { /* nt */
  237. .flags = FL_BASE0 | FL_BASE_BARS,
  238. .num_ports = 2,
  239. .base_baud = 115200,
  240. .uart_offset = 8,
  241. },
  242. [siig_1s1p_10x] = {
  243. .flags = FL_BASE2,
  244. .num_ports = 1,
  245. .base_baud = 460800,
  246. .uart_offset = 8,
  247. },
  248. [siig_2s1p_10x] = {
  249. .flags = FL_BASE2,
  250. .num_ports = 1,
  251. .base_baud = 921600,
  252. .uart_offset = 8,
  253. },
  254. [siig_2p1s_20x] = {
  255. .flags = FL_BASE0,
  256. .num_ports = 1,
  257. .base_baud = 921600,
  258. .uart_offset = 8,
  259. },
  260. [siig_1s1p_20x] = {
  261. .flags = FL_BASE0,
  262. .num_ports = 1,
  263. .base_baud = 921600,
  264. .uart_offset = 8,
  265. },
  266. [siig_2s1p_20x] = {
  267. .flags = FL_BASE0,
  268. .num_ports = 1,
  269. .base_baud = 921600,
  270. .uart_offset = 8,
  271. },
  272. };
  273. struct parport_serial_private {
  274. struct serial_private *serial;
  275. int num_par;
  276. struct parport *port[PARPORT_MAX];
  277. struct parport_pc_pci par;
  278. };
  279. /* Register the serial port(s) of a PCI card. */
  280. static int __devinit serial_register (struct pci_dev *dev,
  281. const struct pci_device_id *id)
  282. {
  283. struct parport_serial_private *priv = pci_get_drvdata (dev);
  284. struct pciserial_board *board;
  285. struct serial_private *serial;
  286. board = &pci_parport_serial_boards[id->driver_data];
  287. serial = pciserial_init_ports(dev, board);
  288. if (IS_ERR(serial))
  289. return PTR_ERR(serial);
  290. priv->serial = serial;
  291. return 0;
  292. }
  293. /* Register the parallel port(s) of a PCI card. */
  294. static int __devinit parport_register (struct pci_dev *dev,
  295. const struct pci_device_id *id)
  296. {
  297. struct parport_pc_pci *card;
  298. struct parport_serial_private *priv = pci_get_drvdata (dev);
  299. int i = id->driver_data, n;
  300. int success = 0;
  301. priv->par = cards[id->driver_data];
  302. card = &priv->par;
  303. if (card->preinit_hook &&
  304. card->preinit_hook (dev, card, PARPORT_IRQ_NONE, PARPORT_DMA_NONE))
  305. return -ENODEV;
  306. for (n = 0; n < card->numports; n++) {
  307. struct parport *port;
  308. int lo = card->addr[n].lo;
  309. int hi = card->addr[n].hi;
  310. unsigned long io_lo, io_hi;
  311. if (priv->num_par == ARRAY_SIZE (priv->port)) {
  312. printk (KERN_WARNING
  313. "parport_serial: %s: only %u parallel ports "
  314. "supported (%d reported)\n", pci_name (dev),
  315. ARRAY_SIZE (priv->port), card->numports);
  316. break;
  317. }
  318. io_lo = pci_resource_start (dev, lo);
  319. io_hi = 0;
  320. if ((hi >= 0) && (hi <= 6))
  321. io_hi = pci_resource_start (dev, hi);
  322. else if (hi > 6)
  323. io_lo += hi; /* Reinterpret the meaning of
  324. "hi" as an offset (see SYBA
  325. def.) */
  326. /* TODO: test if sharing interrupts works */
  327. printk (KERN_DEBUG "PCI parallel port detected: %04x:%04x, "
  328. "I/O at %#lx(%#lx)\n",
  329. parport_serial_pci_tbl[i].vendor,
  330. parport_serial_pci_tbl[i].device, io_lo, io_hi);
  331. port = parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE,
  332. PARPORT_DMA_NONE, dev);
  333. if (port) {
  334. priv->port[priv->num_par++] = port;
  335. success = 1;
  336. }
  337. }
  338. if (card->postinit_hook)
  339. card->postinit_hook (dev, card, !success);
  340. return success ? 0 : 1;
  341. }
  342. static int __devinit parport_serial_pci_probe (struct pci_dev *dev,
  343. const struct pci_device_id *id)
  344. {
  345. struct parport_serial_private *priv;
  346. int err;
  347. priv = kmalloc (sizeof *priv, GFP_KERNEL);
  348. if (!priv)
  349. return -ENOMEM;
  350. memset(priv, 0, sizeof(struct parport_serial_private));
  351. pci_set_drvdata (dev, priv);
  352. err = pci_enable_device (dev);
  353. if (err) {
  354. pci_set_drvdata (dev, NULL);
  355. kfree (priv);
  356. return err;
  357. }
  358. if (parport_register (dev, id)) {
  359. pci_set_drvdata (dev, NULL);
  360. kfree (priv);
  361. return -ENODEV;
  362. }
  363. if (serial_register (dev, id)) {
  364. int i;
  365. for (i = 0; i < priv->num_par; i++)
  366. parport_pc_unregister_port (priv->port[i]);
  367. pci_set_drvdata (dev, NULL);
  368. kfree (priv);
  369. return -ENODEV;
  370. }
  371. return 0;
  372. }
  373. static void __devexit parport_serial_pci_remove (struct pci_dev *dev)
  374. {
  375. struct parport_serial_private *priv = pci_get_drvdata (dev);
  376. int i;
  377. pci_set_drvdata(dev, NULL);
  378. // Serial ports
  379. if (priv->serial)
  380. pciserial_remove_ports(priv->serial);
  381. // Parallel ports
  382. for (i = 0; i < priv->num_par; i++)
  383. parport_pc_unregister_port (priv->port[i]);
  384. kfree (priv);
  385. return;
  386. }
  387. static int parport_serial_pci_suspend(struct pci_dev *dev, pm_message_t state)
  388. {
  389. struct parport_serial_private *priv = pci_get_drvdata(dev);
  390. if (priv->serial)
  391. pciserial_suspend_ports(priv->serial);
  392. /* FIXME: What about parport? */
  393. pci_save_state(dev);
  394. pci_set_power_state(dev, pci_choose_state(dev, state));
  395. return 0;
  396. }
  397. static int parport_serial_pci_resume(struct pci_dev *dev)
  398. {
  399. struct parport_serial_private *priv = pci_get_drvdata(dev);
  400. pci_set_power_state(dev, PCI_D0);
  401. pci_restore_state(dev);
  402. /*
  403. * The device may have been disabled. Re-enable it.
  404. */
  405. pci_enable_device(dev);
  406. if (priv->serial)
  407. pciserial_resume_ports(priv->serial);
  408. /* FIXME: What about parport? */
  409. return 0;
  410. }
  411. static struct pci_driver parport_serial_pci_driver = {
  412. .name = "parport_serial",
  413. .id_table = parport_serial_pci_tbl,
  414. .probe = parport_serial_pci_probe,
  415. .remove = __devexit_p(parport_serial_pci_remove),
  416. .suspend = parport_serial_pci_suspend,
  417. .resume = parport_serial_pci_resume,
  418. };
  419. static int __init parport_serial_init (void)
  420. {
  421. return pci_module_init (&parport_serial_pci_driver);
  422. }
  423. static void __exit parport_serial_exit (void)
  424. {
  425. pci_unregister_driver (&parport_serial_pci_driver);
  426. return;
  427. }
  428. MODULE_AUTHOR("Tim Waugh <twaugh@redhat.com>");
  429. MODULE_DESCRIPTION("Driver for common parallel+serial multi-I/O PCI cards");
  430. MODULE_LICENSE("GPL");
  431. module_init(parport_serial_init);
  432. module_exit(parport_serial_exit);