pc2_init.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. /***************************************************************************
  2. nec7210/pc2_init.c - description
  3. -------------------
  4. initialization for pc2 and pc2a compatible boards
  5. begin : Dec 2001
  6. copyright : (C) 2001, 2002 by Frank Mori Hess
  7. email : fmhess@users.sourceforge.net
  8. ***************************************************************************/
  9. /***************************************************************************
  10. * *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. ***************************************************************************/
  17. #include "pc2.h"
  18. #include <linux/ioport.h>
  19. #include <linux/sched.h>
  20. #include <linux/module.h>
  21. #include <linux/slab.h>
  22. #include <asm/dma.h>
  23. #include <linux/pci.h>
  24. #include <linux/string.h>
  25. #include <linux/init.h>
  26. MODULE_LICENSE("GPL");
  27. int pc2_attach(gpib_board_t *board, gpib_board_config_t config);
  28. int pc2a_attach(gpib_board_t *board, gpib_board_config_t config);
  29. int pc2a_cb7210_attach(gpib_board_t *board, gpib_board_config_t config);
  30. int pc2_2a_attach(gpib_board_t *board, gpib_board_config_t config);
  31. void pc2_detach(gpib_board_t *board);
  32. void pc2a_detach(gpib_board_t *board);
  33. void pc2_2a_detach(gpib_board_t *board);
  34. // wrappers for interface functions
  35. int pc2_read(gpib_board_t *board, uint8_t *buffer, size_t length, int *end, size_t *bytes_read)
  36. {
  37. pc2_private_t *priv = board->private_data;
  38. return nec7210_read(board, &priv->nec7210_priv, buffer, length, end, bytes_read);
  39. }
  40. int pc2_write(gpib_board_t *board, uint8_t *buffer, size_t length, int send_eoi, size_t *bytes_written)
  41. {
  42. pc2_private_t *priv = board->private_data;
  43. return nec7210_write(board, &priv->nec7210_priv, buffer, length, send_eoi, bytes_written);
  44. }
  45. ssize_t pc2_command(gpib_board_t *board, uint8_t *buffer, size_t length)
  46. {
  47. pc2_private_t *priv = board->private_data;
  48. return nec7210_command(board, &priv->nec7210_priv, buffer, length);
  49. }
  50. int pc2_take_control(gpib_board_t *board, int synchronous)
  51. {
  52. pc2_private_t *priv = board->private_data;
  53. return nec7210_take_control(board, &priv->nec7210_priv, synchronous);
  54. }
  55. int pc2_go_to_standby(gpib_board_t *board)
  56. {
  57. pc2_private_t *priv = board->private_data;
  58. return nec7210_go_to_standby(board, &priv->nec7210_priv);
  59. }
  60. void pc2_request_system_control( gpib_board_t *board, int request_control )
  61. {
  62. pc2_private_t *priv = board->private_data;
  63. nec7210_request_system_control( board, &priv->nec7210_priv, request_control );
  64. }
  65. void pc2_interface_clear(gpib_board_t *board, int assert)
  66. {
  67. pc2_private_t *priv = board->private_data;
  68. nec7210_interface_clear(board, &priv->nec7210_priv, assert);
  69. }
  70. void pc2_remote_enable(gpib_board_t *board, int enable)
  71. {
  72. pc2_private_t *priv = board->private_data;
  73. nec7210_remote_enable(board, &priv->nec7210_priv, enable);
  74. }
  75. int pc2_enable_eos(gpib_board_t *board, uint8_t eos_byte, int compare_8_bits)
  76. {
  77. pc2_private_t *priv = board->private_data;
  78. return nec7210_enable_eos(board, &priv->nec7210_priv, eos_byte, compare_8_bits);
  79. }
  80. void pc2_disable_eos(gpib_board_t *board)
  81. {
  82. pc2_private_t *priv = board->private_data;
  83. nec7210_disable_eos(board, &priv->nec7210_priv);
  84. }
  85. unsigned int pc2_update_status( gpib_board_t *board, unsigned int clear_mask )
  86. {
  87. pc2_private_t *priv = board->private_data;
  88. return nec7210_update_status( board, &priv->nec7210_priv, clear_mask );
  89. }
  90. void pc2_primary_address(gpib_board_t *board, unsigned int address)
  91. {
  92. pc2_private_t *priv = board->private_data;
  93. nec7210_primary_address(board, &priv->nec7210_priv, address);
  94. }
  95. void pc2_secondary_address(gpib_board_t *board, unsigned int address, int enable)
  96. {
  97. pc2_private_t *priv = board->private_data;
  98. nec7210_secondary_address(board, &priv->nec7210_priv, address, enable);
  99. }
  100. int pc2_parallel_poll(gpib_board_t *board, uint8_t *result)
  101. {
  102. pc2_private_t *priv = board->private_data;
  103. return nec7210_parallel_poll(board, &priv->nec7210_priv, result);
  104. }
  105. void pc2_parallel_poll_configure(gpib_board_t *board, uint8_t config )
  106. {
  107. pc2_private_t *priv = board->private_data;
  108. nec7210_parallel_poll_configure(board, &priv->nec7210_priv, config );
  109. }
  110. void pc2_parallel_poll_response(gpib_board_t *board, int ist )
  111. {
  112. pc2_private_t *priv = board->private_data;
  113. nec7210_parallel_poll_response(board, &priv->nec7210_priv, ist );
  114. }
  115. void pc2_serial_poll_response(gpib_board_t *board, uint8_t status)
  116. {
  117. pc2_private_t *priv = board->private_data;
  118. nec7210_serial_poll_response(board, &priv->nec7210_priv, status);
  119. }
  120. uint8_t pc2_serial_poll_status( gpib_board_t *board )
  121. {
  122. pc2_private_t *priv = board->private_data;
  123. return nec7210_serial_poll_status( board, &priv->nec7210_priv );
  124. }
  125. unsigned int pc2_t1_delay( gpib_board_t *board, unsigned int nano_sec )
  126. {
  127. pc2_private_t *priv = board->private_data;
  128. return nec7210_t1_delay( board, &priv->nec7210_priv, nano_sec );
  129. }
  130. void pc2_return_to_local( gpib_board_t *board )
  131. {
  132. pc2_private_t *priv = board->private_data;
  133. nec7210_return_to_local( board, &priv->nec7210_priv );
  134. }
  135. gpib_interface_t pc2_interface =
  136. {
  137. name: "pcII",
  138. attach: pc2_attach,
  139. detach: pc2_detach,
  140. read: pc2_read,
  141. write: pc2_write,
  142. command: pc2_command,
  143. take_control: pc2_take_control,
  144. go_to_standby: pc2_go_to_standby,
  145. request_system_control: pc2_request_system_control,
  146. interface_clear: pc2_interface_clear,
  147. remote_enable: pc2_remote_enable,
  148. enable_eos: pc2_enable_eos,
  149. disable_eos: pc2_disable_eos,
  150. parallel_poll: pc2_parallel_poll,
  151. parallel_poll_configure: pc2_parallel_poll_configure,
  152. parallel_poll_response: pc2_parallel_poll_response,
  153. line_status: NULL,
  154. update_status: pc2_update_status,
  155. primary_address: pc2_primary_address,
  156. secondary_address: pc2_secondary_address,
  157. serial_poll_response: pc2_serial_poll_response,
  158. serial_poll_status: pc2_serial_poll_status,
  159. t1_delay: pc2_t1_delay,
  160. return_to_local: pc2_return_to_local,
  161. };
  162. gpib_interface_t pc2a_interface =
  163. {
  164. name: "pcIIa",
  165. attach: pc2a_attach,
  166. detach: pc2a_detach,
  167. read: pc2_read,
  168. write: pc2_write,
  169. command: pc2_command,
  170. take_control: pc2_take_control,
  171. go_to_standby: pc2_go_to_standby,
  172. request_system_control: pc2_request_system_control,
  173. interface_clear: pc2_interface_clear,
  174. remote_enable: pc2_remote_enable,
  175. enable_eos: pc2_enable_eos,
  176. disable_eos: pc2_disable_eos,
  177. parallel_poll: pc2_parallel_poll,
  178. parallel_poll_configure: pc2_parallel_poll_configure,
  179. parallel_poll_response: pc2_parallel_poll_response,
  180. line_status: NULL,
  181. update_status: pc2_update_status,
  182. primary_address: pc2_primary_address,
  183. secondary_address: pc2_secondary_address,
  184. serial_poll_response: pc2_serial_poll_response,
  185. serial_poll_status: pc2_serial_poll_status,
  186. t1_delay: pc2_t1_delay,
  187. return_to_local: pc2_return_to_local,
  188. };
  189. gpib_interface_t pc2a_cb7210_interface =
  190. {
  191. name: "pcIIa_cb7210",
  192. attach: pc2a_cb7210_attach,
  193. detach: pc2a_detach,
  194. read: pc2_read,
  195. write: pc2_write,
  196. command: pc2_command,
  197. take_control: pc2_take_control,
  198. go_to_standby: pc2_go_to_standby,
  199. request_system_control: pc2_request_system_control,
  200. interface_clear: pc2_interface_clear,
  201. remote_enable: pc2_remote_enable,
  202. enable_eos: pc2_enable_eos,
  203. disable_eos: pc2_disable_eos,
  204. parallel_poll: pc2_parallel_poll,
  205. parallel_poll_configure: pc2_parallel_poll_configure,
  206. parallel_poll_response: pc2_parallel_poll_response,
  207. line_status: NULL, //XXX
  208. update_status: pc2_update_status,
  209. primary_address: pc2_primary_address,
  210. secondary_address: pc2_secondary_address,
  211. serial_poll_response: pc2_serial_poll_response,
  212. serial_poll_status: pc2_serial_poll_status,
  213. t1_delay: pc2_t1_delay,
  214. return_to_local: pc2_return_to_local,
  215. };
  216. gpib_interface_t pc2_2a_interface =
  217. {
  218. name: "pcII_IIa",
  219. attach: pc2_2a_attach,
  220. detach: pc2_2a_detach,
  221. read: pc2_read,
  222. write: pc2_write,
  223. command: pc2_command,
  224. take_control: pc2_take_control,
  225. go_to_standby: pc2_go_to_standby,
  226. request_system_control: pc2_request_system_control,
  227. interface_clear: pc2_interface_clear,
  228. remote_enable: pc2_remote_enable,
  229. enable_eos: pc2_enable_eos,
  230. disable_eos: pc2_disable_eos,
  231. parallel_poll: pc2_parallel_poll,
  232. parallel_poll_configure: pc2_parallel_poll_configure,
  233. parallel_poll_response: pc2_parallel_poll_response,
  234. line_status: NULL,
  235. update_status: pc2_update_status,
  236. primary_address: pc2_primary_address,
  237. secondary_address: pc2_secondary_address,
  238. serial_poll_response: pc2_serial_poll_response,
  239. serial_poll_status: pc2_serial_poll_status,
  240. t1_delay: pc2_t1_delay,
  241. return_to_local: pc2_return_to_local,
  242. };
  243. static int allocate_private(gpib_board_t *board)
  244. {
  245. pc2_private_t *priv;
  246. board->private_data = kmalloc(sizeof(pc2_private_t), GFP_KERNEL);
  247. if(board->private_data == NULL)
  248. return -1;
  249. priv = board->private_data;
  250. memset( priv, 0, sizeof(pc2_private_t));
  251. init_nec7210_private( &priv->nec7210_priv );
  252. return 0;
  253. }
  254. static void free_private(gpib_board_t *board)
  255. {
  256. if(board->private_data)
  257. {
  258. kfree(board->private_data);
  259. board->private_data = NULL;
  260. }
  261. }
  262. int pc2_generic_attach(gpib_board_t *board, enum nec7210_chipset chipset)
  263. {
  264. pc2_private_t *pc2_priv;
  265. nec7210_private_t *nec_priv;
  266. board->status = 0;
  267. if(allocate_private(board))
  268. return -ENOMEM;
  269. pc2_priv = board->private_data;
  270. nec_priv = &pc2_priv->nec7210_priv;
  271. nec_priv->read_byte = nec7210_ioport_read_byte;
  272. nec_priv->write_byte = nec7210_ioport_write_byte;
  273. nec_priv->type = chipset;
  274. if(board->ibdma)
  275. {
  276. nec_priv->dma_buffer_length = 0x1000;
  277. nec_priv->dma_buffer = pci_alloc_consistent(NULL, nec_priv->dma_buffer_length,
  278. &nec_priv->dma_buffer_addr);
  279. if(nec_priv->dma_buffer == NULL)
  280. return -ENOMEM;
  281. // request isa dma channel
  282. if( request_dma( board->ibdma, "pc2" ) )
  283. {
  284. printk("gpib: can't request DMA %d\n", board->ibdma);
  285. return -1;
  286. }
  287. nec_priv->dma_channel = board->ibdma;
  288. }
  289. return 0;
  290. }
  291. int pc2_attach(gpib_board_t *board, gpib_board_config_t config)
  292. {
  293. int isr_flags = 0;
  294. pc2_private_t *pc2_priv;
  295. nec7210_private_t *nec_priv;
  296. int retval;
  297. retval = pc2_generic_attach(board, NEC7210);
  298. if(retval) return retval;
  299. pc2_priv = board->private_data;
  300. nec_priv = &pc2_priv->nec7210_priv;
  301. nec_priv->offset = pc2_reg_offset;
  302. if(request_region((unsigned long)(board->ibbase), pc2_iosize, "pc2") == 0)
  303. {
  304. printk("gpib: ioports are already in use\n");
  305. return -1;
  306. }
  307. nec_priv->iobase = board->ibbase;
  308. nec7210_board_reset( nec_priv, board );
  309. // install interrupt handler
  310. if(board->ibirq)
  311. {
  312. if(request_irq(board->ibirq, pc2_interrupt, isr_flags, "pc2", board))
  313. {
  314. printk("gpib: can't request IRQ %d\n", board->ibirq);
  315. return -1;
  316. }
  317. }
  318. pc2_priv->irq = board->ibirq;
  319. /* poll so we can detect assertion of ATN */
  320. if(gpib_request_pseudo_irq(board, pc2_interrupt))
  321. {
  322. printk("pc2_gpib: failed to allocate pseudo_irq\n");
  323. return -1;
  324. }
  325. /* set internal counter register for 8 MHz input clock */
  326. write_byte( nec_priv, ICR | 8, AUXMR );
  327. nec7210_board_online( nec_priv, board );
  328. return 0;
  329. }
  330. void pc2_detach(gpib_board_t *board)
  331. {
  332. pc2_private_t *pc2_priv = board->private_data;
  333. nec7210_private_t *nec_priv;
  334. if(pc2_priv)
  335. {
  336. nec_priv = &pc2_priv->nec7210_priv;
  337. if(nec_priv->dma_channel)
  338. {
  339. free_dma(nec_priv->dma_channel);
  340. }
  341. gpib_free_pseudo_irq(board);
  342. if(pc2_priv->irq)
  343. {
  344. free_irq(pc2_priv->irq, board);
  345. }
  346. if(nec_priv->iobase)
  347. {
  348. nec7210_board_reset( nec_priv, board );
  349. release_region((unsigned long)(nec_priv->iobase), pc2_iosize);
  350. }
  351. if(nec_priv->dma_buffer)
  352. {
  353. pci_free_consistent(NULL, nec_priv->dma_buffer_length, nec_priv->dma_buffer,
  354. nec_priv->dma_buffer_addr);
  355. nec_priv->dma_buffer = NULL;
  356. }
  357. }
  358. free_private(board);
  359. }
  360. int pc2a_common_attach(gpib_board_t *board, unsigned int num_registers, enum nec7210_chipset chipset)
  361. {
  362. unsigned int i, err;
  363. pc2_private_t *pc2_priv;
  364. nec7210_private_t *nec_priv;
  365. int retval;
  366. retval = pc2_generic_attach(board, chipset);
  367. if(retval) return retval;
  368. pc2_priv = board->private_data;
  369. nec_priv = &pc2_priv->nec7210_priv;
  370. nec_priv->offset = pc2a_reg_offset;
  371. switch((unsigned long)(board->ibbase))
  372. {
  373. case 0x02e1:
  374. case 0x22e1:
  375. case 0x42e1:
  376. case 0x62e1:
  377. break;
  378. default:
  379. printk("PCIIa base range invalid, must be one of 0x[0246]2e1, but is 0x%p \n", board->ibbase);
  380. return -1;
  381. break;
  382. }
  383. if(board->ibirq)
  384. {
  385. if(board->ibirq < 2 || board->ibirq > 7)
  386. {
  387. printk("pc2_gpib: illegal interrupt level %i\n", board->ibirq);
  388. return -1;
  389. }
  390. }else
  391. {
  392. printk("pc2_gpib: interrupt disabled, using polling mode (slow)\n");
  393. }
  394. err = 0;
  395. for(i = 0; i < num_registers; i++)
  396. {
  397. if(check_region((unsigned long)(board->ibbase) + i * pc2a_reg_offset, 1))
  398. err++;
  399. }
  400. if(board->ibirq && check_region(pc2a_clear_intr_iobase + board->ibirq, 1))
  401. {
  402. err++;
  403. }
  404. if(err)
  405. {
  406. printk("gpib: ioports are already in use");
  407. return -1;
  408. }
  409. for(i = 0; i < num_registers; i++)
  410. {
  411. request_region((unsigned long)(board->ibbase) + i * pc2a_reg_offset, 1, "pc2a");
  412. }
  413. nec_priv->iobase = board->ibbase;
  414. if(board->ibirq)
  415. {
  416. request_region(pc2a_clear_intr_iobase + board->ibirq, 1, "pc2a");
  417. pc2_priv->clear_intr_addr = pc2a_clear_intr_iobase + board->ibirq;
  418. if(request_irq(board->ibirq, pc2a_interrupt, 0, "pc2a", board))
  419. {
  420. printk("gpib: can't request IRQ %d\n", board->ibirq);
  421. return -1;
  422. }
  423. }
  424. pc2_priv->irq = board->ibirq;
  425. /* poll so we can detect assertion of ATN */
  426. if(gpib_request_pseudo_irq(board, pc2_interrupt))
  427. {
  428. printk("pc2_gpib: failed to allocate pseudo_irq\n");
  429. return -1;
  430. }
  431. // make sure interrupt is clear
  432. if(pc2_priv->irq)
  433. outb(0xff , CLEAR_INTR_REG(pc2_priv->irq));
  434. nec7210_board_reset( nec_priv, board );
  435. /* set internal counter register for 8 MHz input clock */
  436. write_byte( nec_priv, ICR | 8, AUXMR );
  437. nec7210_board_online( nec_priv, board );
  438. return 0;
  439. }
  440. int pc2a_attach( gpib_board_t *board, gpib_board_config_t config )
  441. {
  442. return pc2a_common_attach(board, pc2a_iosize, NEC7210);
  443. }
  444. int pc2a_cb7210_attach( gpib_board_t *board, gpib_board_config_t config )
  445. {
  446. return pc2a_common_attach(board, pc2a_iosize, CB7210);
  447. }
  448. int pc2_2a_attach( gpib_board_t *board, gpib_board_config_t config )
  449. {
  450. return pc2a_common_attach( board, pc2_2a_iosize, NAT4882);
  451. }
  452. void pc2a_common_detach( gpib_board_t *board, unsigned int num_registers )
  453. {
  454. int i;
  455. pc2_private_t *pc2_priv = board->private_data;
  456. nec7210_private_t *nec_priv;
  457. if(pc2_priv)
  458. {
  459. nec_priv = &pc2_priv->nec7210_priv;
  460. if(nec_priv->dma_channel)
  461. {
  462. free_dma(nec_priv->dma_channel);
  463. }
  464. gpib_free_pseudo_irq(board);
  465. if(pc2_priv->irq)
  466. {
  467. free_irq(pc2_priv->irq, board);
  468. }
  469. if(nec_priv->iobase)
  470. {
  471. nec7210_board_reset( nec_priv, board );
  472. for(i = 0; i < num_registers; i++)
  473. release_region((unsigned long)(nec_priv->iobase) + i * pc2a_reg_offset, 1);
  474. }
  475. if(pc2_priv->clear_intr_addr)
  476. release_region(pc2_priv->clear_intr_addr, 1);
  477. if(nec_priv->dma_buffer)
  478. {
  479. pci_free_consistent(NULL, nec_priv->dma_buffer_length, nec_priv->dma_buffer,
  480. nec_priv->dma_buffer_addr);
  481. nec_priv->dma_buffer = NULL;
  482. }
  483. }
  484. free_private(board);
  485. }
  486. void pc2a_detach( gpib_board_t *board )
  487. {
  488. pc2a_common_detach( board, pc2a_iosize );
  489. }
  490. void pc2_2a_detach( gpib_board_t *board )
  491. {
  492. pc2a_common_detach( board, pc2_2a_iosize );
  493. }
  494. static int __init pc2_init_module( void )
  495. {
  496. gpib_register_driver(&pc2_interface, THIS_MODULE);
  497. gpib_register_driver(&pc2a_interface, THIS_MODULE);
  498. gpib_register_driver(&pc2a_cb7210_interface, THIS_MODULE);
  499. gpib_register_driver(&pc2_2a_interface, THIS_MODULE);
  500. return 0;
  501. }
  502. static void __exit pc2_exit_module( void )
  503. {
  504. gpib_unregister_driver(&pc2_interface);
  505. gpib_unregister_driver(&pc2a_interface);
  506. gpib_unregister_driver(&pc2a_cb7210_interface);
  507. gpib_unregister_driver(&pc2_2a_interface);
  508. }
  509. module_init( pc2_init_module );
  510. module_exit( pc2_exit_module );