tpci200.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * driver for the TEWS TPCI-200 device
  4. *
  5. * Copyright (C) 2009-2012 CERN (www.cern.ch)
  6. * Author: Nicolas Serafini, EIC2 SA
  7. * Author: Samuel Iglesias Gonsalvez <[email protected]>
  8. */
  9. #include <linux/module.h>
  10. #include <linux/slab.h>
  11. #include "tpci200.h"
  12. static const u16 tpci200_status_timeout[] = {
  13. TPCI200_A_TIMEOUT,
  14. TPCI200_B_TIMEOUT,
  15. TPCI200_C_TIMEOUT,
  16. TPCI200_D_TIMEOUT,
  17. };
  18. static const u16 tpci200_status_error[] = {
  19. TPCI200_A_ERROR,
  20. TPCI200_B_ERROR,
  21. TPCI200_C_ERROR,
  22. TPCI200_D_ERROR,
  23. };
  24. static const size_t tpci200_space_size[IPACK_SPACE_COUNT] = {
  25. [IPACK_IO_SPACE] = TPCI200_IO_SPACE_SIZE,
  26. [IPACK_ID_SPACE] = TPCI200_ID_SPACE_SIZE,
  27. [IPACK_INT_SPACE] = TPCI200_INT_SPACE_SIZE,
  28. [IPACK_MEM8_SPACE] = TPCI200_MEM8_SPACE_SIZE,
  29. [IPACK_MEM16_SPACE] = TPCI200_MEM16_SPACE_SIZE,
  30. };
  31. static const size_t tpci200_space_interval[IPACK_SPACE_COUNT] = {
  32. [IPACK_IO_SPACE] = TPCI200_IO_SPACE_INTERVAL,
  33. [IPACK_ID_SPACE] = TPCI200_ID_SPACE_INTERVAL,
  34. [IPACK_INT_SPACE] = TPCI200_INT_SPACE_INTERVAL,
  35. [IPACK_MEM8_SPACE] = TPCI200_MEM8_SPACE_INTERVAL,
  36. [IPACK_MEM16_SPACE] = TPCI200_MEM16_SPACE_INTERVAL,
  37. };
  38. static struct tpci200_board *check_slot(struct ipack_device *dev)
  39. {
  40. struct tpci200_board *tpci200;
  41. if (dev == NULL)
  42. return NULL;
  43. tpci200 = dev_get_drvdata(dev->bus->parent);
  44. if (tpci200 == NULL) {
  45. dev_info(&dev->dev, "carrier board not found\n");
  46. return NULL;
  47. }
  48. if (dev->slot >= TPCI200_NB_SLOT) {
  49. dev_info(&dev->dev,
  50. "Slot [%d:%d] doesn't exist! Last tpci200 slot is %d.\n",
  51. dev->bus->bus_nr, dev->slot, TPCI200_NB_SLOT-1);
  52. return NULL;
  53. }
  54. return tpci200;
  55. }
  56. static void tpci200_clear_mask(struct tpci200_board *tpci200,
  57. __le16 __iomem *addr, u16 mask)
  58. {
  59. unsigned long flags;
  60. spin_lock_irqsave(&tpci200->regs_lock, flags);
  61. iowrite16(ioread16(addr) & (~mask), addr);
  62. spin_unlock_irqrestore(&tpci200->regs_lock, flags);
  63. }
  64. static void tpci200_set_mask(struct tpci200_board *tpci200,
  65. __le16 __iomem *addr, u16 mask)
  66. {
  67. unsigned long flags;
  68. spin_lock_irqsave(&tpci200->regs_lock, flags);
  69. iowrite16(ioread16(addr) | mask, addr);
  70. spin_unlock_irqrestore(&tpci200->regs_lock, flags);
  71. }
  72. static void tpci200_unregister(struct tpci200_board *tpci200)
  73. {
  74. free_irq(tpci200->info->pdev->irq, (void *) tpci200);
  75. pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
  76. pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
  77. pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
  78. pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
  79. pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
  80. pci_disable_device(tpci200->info->pdev);
  81. }
  82. static void tpci200_enable_irq(struct tpci200_board *tpci200,
  83. int islot)
  84. {
  85. tpci200_set_mask(tpci200,
  86. &tpci200->info->interface_regs->control[islot],
  87. TPCI200_INT0_EN | TPCI200_INT1_EN);
  88. }
  89. static void tpci200_disable_irq(struct tpci200_board *tpci200,
  90. int islot)
  91. {
  92. tpci200_clear_mask(tpci200,
  93. &tpci200->info->interface_regs->control[islot],
  94. TPCI200_INT0_EN | TPCI200_INT1_EN);
  95. }
  96. static irqreturn_t tpci200_slot_irq(struct slot_irq *slot_irq)
  97. {
  98. irqreturn_t ret;
  99. if (!slot_irq)
  100. return -ENODEV;
  101. ret = slot_irq->handler(slot_irq->arg);
  102. return ret;
  103. }
  104. static irqreturn_t tpci200_interrupt(int irq, void *dev_id)
  105. {
  106. struct tpci200_board *tpci200 = (struct tpci200_board *) dev_id;
  107. struct slot_irq *slot_irq;
  108. irqreturn_t ret;
  109. u16 status_reg;
  110. int i;
  111. /* Read status register */
  112. status_reg = ioread16(&tpci200->info->interface_regs->status);
  113. /* Did we cause the interrupt? */
  114. if (!(status_reg & TPCI200_SLOT_INT_MASK))
  115. return IRQ_NONE;
  116. /* callback to the IRQ handler for the corresponding slot */
  117. rcu_read_lock();
  118. for (i = 0; i < TPCI200_NB_SLOT; i++) {
  119. if (!(status_reg & ((TPCI200_A_INT0 | TPCI200_A_INT1) << (2 * i))))
  120. continue;
  121. slot_irq = rcu_dereference(tpci200->slots[i].irq);
  122. ret = tpci200_slot_irq(slot_irq);
  123. if (ret == -ENODEV) {
  124. dev_info(&tpci200->info->pdev->dev,
  125. "No registered ISR for slot [%d:%d]!. IRQ will be disabled.\n",
  126. tpci200->number, i);
  127. tpci200_disable_irq(tpci200, i);
  128. }
  129. }
  130. rcu_read_unlock();
  131. return IRQ_HANDLED;
  132. }
  133. static int tpci200_free_irq(struct ipack_device *dev)
  134. {
  135. struct slot_irq *slot_irq;
  136. struct tpci200_board *tpci200;
  137. tpci200 = check_slot(dev);
  138. if (tpci200 == NULL)
  139. return -EINVAL;
  140. if (mutex_lock_interruptible(&tpci200->mutex))
  141. return -ERESTARTSYS;
  142. if (tpci200->slots[dev->slot].irq == NULL) {
  143. mutex_unlock(&tpci200->mutex);
  144. return -EINVAL;
  145. }
  146. tpci200_disable_irq(tpci200, dev->slot);
  147. slot_irq = tpci200->slots[dev->slot].irq;
  148. /* uninstall handler */
  149. RCU_INIT_POINTER(tpci200->slots[dev->slot].irq, NULL);
  150. synchronize_rcu();
  151. kfree(slot_irq);
  152. mutex_unlock(&tpci200->mutex);
  153. return 0;
  154. }
  155. static int tpci200_request_irq(struct ipack_device *dev,
  156. irqreturn_t (*handler)(void *), void *arg)
  157. {
  158. int res = 0;
  159. struct slot_irq *slot_irq;
  160. struct tpci200_board *tpci200;
  161. tpci200 = check_slot(dev);
  162. if (tpci200 == NULL)
  163. return -EINVAL;
  164. if (mutex_lock_interruptible(&tpci200->mutex))
  165. return -ERESTARTSYS;
  166. if (tpci200->slots[dev->slot].irq != NULL) {
  167. dev_err(&dev->dev,
  168. "Slot [%d:%d] IRQ already registered !\n",
  169. dev->bus->bus_nr,
  170. dev->slot);
  171. res = -EINVAL;
  172. goto out_unlock;
  173. }
  174. slot_irq = kzalloc(sizeof(struct slot_irq), GFP_KERNEL);
  175. if (slot_irq == NULL) {
  176. dev_err(&dev->dev,
  177. "Slot [%d:%d] unable to allocate memory for IRQ !\n",
  178. dev->bus->bus_nr, dev->slot);
  179. res = -ENOMEM;
  180. goto out_unlock;
  181. }
  182. /*
  183. * WARNING: Setup Interrupt Vector in the IndustryPack device
  184. * before an IRQ request.
  185. * Read the User Manual of your IndustryPack device to know
  186. * where to write the vector in memory.
  187. */
  188. slot_irq->handler = handler;
  189. slot_irq->arg = arg;
  190. slot_irq->holder = dev;
  191. rcu_assign_pointer(tpci200->slots[dev->slot].irq, slot_irq);
  192. tpci200_enable_irq(tpci200, dev->slot);
  193. out_unlock:
  194. mutex_unlock(&tpci200->mutex);
  195. return res;
  196. }
  197. static int tpci200_register(struct tpci200_board *tpci200)
  198. {
  199. int i;
  200. int res;
  201. phys_addr_t ioidint_base;
  202. unsigned short slot_ctrl;
  203. if (pci_enable_device(tpci200->info->pdev) < 0)
  204. return -ENODEV;
  205. /* Request IP interface register (Bar 2) */
  206. res = pci_request_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR,
  207. "Carrier IP interface registers");
  208. if (res) {
  209. dev_err(&tpci200->info->pdev->dev,
  210. "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 2 !",
  211. tpci200->info->pdev->bus->number,
  212. tpci200->info->pdev->devfn);
  213. goto err_disable_device;
  214. }
  215. /* Request IO ID INT space (Bar 3) */
  216. res = pci_request_region(tpci200->info->pdev,
  217. TPCI200_IO_ID_INT_SPACES_BAR,
  218. "Carrier IO ID INT space");
  219. if (res) {
  220. dev_err(&tpci200->info->pdev->dev,
  221. "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 3 !",
  222. tpci200->info->pdev->bus->number,
  223. tpci200->info->pdev->devfn);
  224. goto err_ip_interface_bar;
  225. }
  226. /* Request MEM8 space (Bar 5) */
  227. res = pci_request_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR,
  228. "Carrier MEM8 space");
  229. if (res) {
  230. dev_err(&tpci200->info->pdev->dev,
  231. "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 5!",
  232. tpci200->info->pdev->bus->number,
  233. tpci200->info->pdev->devfn);
  234. goto err_io_id_int_spaces_bar;
  235. }
  236. /* Request MEM16 space (Bar 4) */
  237. res = pci_request_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR,
  238. "Carrier MEM16 space");
  239. if (res) {
  240. dev_err(&tpci200->info->pdev->dev,
  241. "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 4!",
  242. tpci200->info->pdev->bus->number,
  243. tpci200->info->pdev->devfn);
  244. goto err_mem8_space_bar;
  245. }
  246. /* Map internal tpci200 driver user space */
  247. tpci200->info->interface_regs =
  248. ioremap(pci_resource_start(tpci200->info->pdev,
  249. TPCI200_IP_INTERFACE_BAR),
  250. TPCI200_IFACE_SIZE);
  251. if (!tpci200->info->interface_regs) {
  252. dev_err(&tpci200->info->pdev->dev,
  253. "(bn 0x%X, sn 0x%X) failed to map driver user space!",
  254. tpci200->info->pdev->bus->number,
  255. tpci200->info->pdev->devfn);
  256. res = -ENOMEM;
  257. goto err_mem16_space_bar;
  258. }
  259. /* Initialize lock that protects interface_regs */
  260. spin_lock_init(&tpci200->regs_lock);
  261. ioidint_base = pci_resource_start(tpci200->info->pdev,
  262. TPCI200_IO_ID_INT_SPACES_BAR);
  263. tpci200->mod_mem[IPACK_IO_SPACE] = ioidint_base + TPCI200_IO_SPACE_OFF;
  264. tpci200->mod_mem[IPACK_ID_SPACE] = ioidint_base + TPCI200_ID_SPACE_OFF;
  265. tpci200->mod_mem[IPACK_INT_SPACE] =
  266. ioidint_base + TPCI200_INT_SPACE_OFF;
  267. tpci200->mod_mem[IPACK_MEM8_SPACE] =
  268. pci_resource_start(tpci200->info->pdev,
  269. TPCI200_MEM8_SPACE_BAR);
  270. tpci200->mod_mem[IPACK_MEM16_SPACE] =
  271. pci_resource_start(tpci200->info->pdev,
  272. TPCI200_MEM16_SPACE_BAR);
  273. /* Set the default parameters of the slot
  274. * INT0 disabled, level sensitive
  275. * INT1 disabled, level sensitive
  276. * error interrupt disabled
  277. * timeout interrupt disabled
  278. * recover time disabled
  279. * clock rate 8 MHz
  280. */
  281. slot_ctrl = 0;
  282. for (i = 0; i < TPCI200_NB_SLOT; i++)
  283. writew(slot_ctrl, &tpci200->info->interface_regs->control[i]);
  284. res = request_irq(tpci200->info->pdev->irq,
  285. tpci200_interrupt, IRQF_SHARED,
  286. KBUILD_MODNAME, (void *) tpci200);
  287. if (res) {
  288. dev_err(&tpci200->info->pdev->dev,
  289. "(bn 0x%X, sn 0x%X) unable to register IRQ !",
  290. tpci200->info->pdev->bus->number,
  291. tpci200->info->pdev->devfn);
  292. goto err_interface_regs;
  293. }
  294. return 0;
  295. err_interface_regs:
  296. pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
  297. err_mem16_space_bar:
  298. pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
  299. err_mem8_space_bar:
  300. pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
  301. err_io_id_int_spaces_bar:
  302. pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
  303. err_ip_interface_bar:
  304. pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
  305. err_disable_device:
  306. pci_disable_device(tpci200->info->pdev);
  307. return res;
  308. }
  309. static int tpci200_get_clockrate(struct ipack_device *dev)
  310. {
  311. struct tpci200_board *tpci200 = check_slot(dev);
  312. __le16 __iomem *addr;
  313. if (!tpci200)
  314. return -ENODEV;
  315. addr = &tpci200->info->interface_regs->control[dev->slot];
  316. return (ioread16(addr) & TPCI200_CLK32) ? 32 : 8;
  317. }
  318. static int tpci200_set_clockrate(struct ipack_device *dev, int mherz)
  319. {
  320. struct tpci200_board *tpci200 = check_slot(dev);
  321. __le16 __iomem *addr;
  322. if (!tpci200)
  323. return -ENODEV;
  324. addr = &tpci200->info->interface_regs->control[dev->slot];
  325. switch (mherz) {
  326. case 8:
  327. tpci200_clear_mask(tpci200, addr, TPCI200_CLK32);
  328. break;
  329. case 32:
  330. tpci200_set_mask(tpci200, addr, TPCI200_CLK32);
  331. break;
  332. default:
  333. return -EINVAL;
  334. }
  335. return 0;
  336. }
  337. static int tpci200_get_error(struct ipack_device *dev)
  338. {
  339. struct tpci200_board *tpci200 = check_slot(dev);
  340. __le16 __iomem *addr;
  341. u16 mask;
  342. if (!tpci200)
  343. return -ENODEV;
  344. addr = &tpci200->info->interface_regs->status;
  345. mask = tpci200_status_error[dev->slot];
  346. return (ioread16(addr) & mask) ? 1 : 0;
  347. }
  348. static int tpci200_get_timeout(struct ipack_device *dev)
  349. {
  350. struct tpci200_board *tpci200 = check_slot(dev);
  351. __le16 __iomem *addr;
  352. u16 mask;
  353. if (!tpci200)
  354. return -ENODEV;
  355. addr = &tpci200->info->interface_regs->status;
  356. mask = tpci200_status_timeout[dev->slot];
  357. return (ioread16(addr) & mask) ? 1 : 0;
  358. }
  359. static int tpci200_reset_timeout(struct ipack_device *dev)
  360. {
  361. struct tpci200_board *tpci200 = check_slot(dev);
  362. __le16 __iomem *addr;
  363. u16 mask;
  364. if (!tpci200)
  365. return -ENODEV;
  366. addr = &tpci200->info->interface_regs->status;
  367. mask = tpci200_status_timeout[dev->slot];
  368. iowrite16(mask, addr);
  369. return 0;
  370. }
  371. static void tpci200_uninstall(struct tpci200_board *tpci200)
  372. {
  373. tpci200_unregister(tpci200);
  374. kfree(tpci200->slots);
  375. }
  376. static const struct ipack_bus_ops tpci200_bus_ops = {
  377. .request_irq = tpci200_request_irq,
  378. .free_irq = tpci200_free_irq,
  379. .get_clockrate = tpci200_get_clockrate,
  380. .set_clockrate = tpci200_set_clockrate,
  381. .get_error = tpci200_get_error,
  382. .get_timeout = tpci200_get_timeout,
  383. .reset_timeout = tpci200_reset_timeout,
  384. };
  385. static int tpci200_install(struct tpci200_board *tpci200)
  386. {
  387. int res;
  388. tpci200->slots = kcalloc(TPCI200_NB_SLOT, sizeof(struct tpci200_slot),
  389. GFP_KERNEL);
  390. if (tpci200->slots == NULL)
  391. return -ENOMEM;
  392. res = tpci200_register(tpci200);
  393. if (res) {
  394. kfree(tpci200->slots);
  395. tpci200->slots = NULL;
  396. return res;
  397. }
  398. mutex_init(&tpci200->mutex);
  399. return 0;
  400. }
  401. static void tpci200_release_device(struct ipack_device *dev)
  402. {
  403. kfree(dev);
  404. }
  405. static int tpci200_create_device(struct tpci200_board *tpci200, int i)
  406. {
  407. int ret;
  408. enum ipack_space space;
  409. struct ipack_device *dev =
  410. kzalloc(sizeof(struct ipack_device), GFP_KERNEL);
  411. if (!dev)
  412. return -ENOMEM;
  413. dev->slot = i;
  414. dev->bus = tpci200->info->ipack_bus;
  415. dev->release = tpci200_release_device;
  416. for (space = 0; space < IPACK_SPACE_COUNT; space++) {
  417. dev->region[space].start =
  418. tpci200->mod_mem[space]
  419. + tpci200_space_interval[space] * i;
  420. dev->region[space].size = tpci200_space_size[space];
  421. }
  422. ret = ipack_device_init(dev);
  423. if (ret < 0) {
  424. ipack_put_device(dev);
  425. return ret;
  426. }
  427. ret = ipack_device_add(dev);
  428. if (ret < 0)
  429. ipack_put_device(dev);
  430. return ret;
  431. }
  432. static int tpci200_pci_probe(struct pci_dev *pdev,
  433. const struct pci_device_id *id)
  434. {
  435. int ret, i;
  436. struct tpci200_board *tpci200;
  437. u32 reg32;
  438. tpci200 = kzalloc(sizeof(struct tpci200_board), GFP_KERNEL);
  439. if (!tpci200)
  440. return -ENOMEM;
  441. tpci200->info = kzalloc(sizeof(struct tpci200_infos), GFP_KERNEL);
  442. if (!tpci200->info) {
  443. ret = -ENOMEM;
  444. goto err_tpci200;
  445. }
  446. pci_dev_get(pdev);
  447. /* Obtain a mapping of the carrier's PCI configuration registers */
  448. ret = pci_request_region(pdev, TPCI200_CFG_MEM_BAR,
  449. KBUILD_MODNAME " Configuration Memory");
  450. if (ret) {
  451. dev_err(&pdev->dev, "Failed to allocate PCI Configuration Memory");
  452. ret = -EBUSY;
  453. goto err_tpci200_info;
  454. }
  455. tpci200->info->cfg_regs = ioremap(
  456. pci_resource_start(pdev, TPCI200_CFG_MEM_BAR),
  457. pci_resource_len(pdev, TPCI200_CFG_MEM_BAR));
  458. if (!tpci200->info->cfg_regs) {
  459. dev_err(&pdev->dev, "Failed to map PCI Configuration Memory");
  460. ret = -EFAULT;
  461. goto err_request_region;
  462. }
  463. /* Disable byte swapping for 16 bit IP module access. This will ensure
  464. * that the Industrypack big endian byte order is preserved by the
  465. * carrier. */
  466. reg32 = ioread32(tpci200->info->cfg_regs + LAS1_DESC);
  467. reg32 |= 1 << LAS_BIT_BIGENDIAN;
  468. iowrite32(reg32, tpci200->info->cfg_regs + LAS1_DESC);
  469. reg32 = ioread32(tpci200->info->cfg_regs + LAS2_DESC);
  470. reg32 |= 1 << LAS_BIT_BIGENDIAN;
  471. iowrite32(reg32, tpci200->info->cfg_regs + LAS2_DESC);
  472. /* Save struct pci_dev pointer */
  473. tpci200->info->pdev = pdev;
  474. tpci200->info->id_table = (struct pci_device_id *)id;
  475. /* register the device and initialize it */
  476. ret = tpci200_install(tpci200);
  477. if (ret) {
  478. dev_err(&pdev->dev, "error during tpci200 install\n");
  479. ret = -ENODEV;
  480. goto err_cfg_regs;
  481. }
  482. /* Register the carrier in the industry pack bus driver */
  483. tpci200->info->ipack_bus = ipack_bus_register(&pdev->dev,
  484. TPCI200_NB_SLOT,
  485. &tpci200_bus_ops,
  486. THIS_MODULE);
  487. if (!tpci200->info->ipack_bus) {
  488. dev_err(&pdev->dev,
  489. "error registering the carrier on ipack driver\n");
  490. ret = -EFAULT;
  491. goto err_tpci200_install;
  492. }
  493. /* save the bus number given by ipack to logging purpose */
  494. tpci200->number = tpci200->info->ipack_bus->bus_nr;
  495. dev_set_drvdata(&pdev->dev, tpci200);
  496. for (i = 0; i < TPCI200_NB_SLOT; i++)
  497. tpci200_create_device(tpci200, i);
  498. return 0;
  499. err_tpci200_install:
  500. tpci200_uninstall(tpci200);
  501. err_cfg_regs:
  502. pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
  503. err_request_region:
  504. pci_release_region(pdev, TPCI200_CFG_MEM_BAR);
  505. err_tpci200_info:
  506. kfree(tpci200->info);
  507. pci_dev_put(pdev);
  508. err_tpci200:
  509. kfree(tpci200);
  510. return ret;
  511. }
  512. static void __tpci200_pci_remove(struct tpci200_board *tpci200)
  513. {
  514. ipack_bus_unregister(tpci200->info->ipack_bus);
  515. tpci200_uninstall(tpci200);
  516. pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
  517. pci_release_region(tpci200->info->pdev, TPCI200_CFG_MEM_BAR);
  518. pci_dev_put(tpci200->info->pdev);
  519. kfree(tpci200->info);
  520. kfree(tpci200);
  521. }
  522. static void tpci200_pci_remove(struct pci_dev *dev)
  523. {
  524. struct tpci200_board *tpci200 = pci_get_drvdata(dev);
  525. __tpci200_pci_remove(tpci200);
  526. }
  527. static const struct pci_device_id tpci200_idtable[] = {
  528. { TPCI200_VENDOR_ID, TPCI200_DEVICE_ID, TPCI200_SUBVENDOR_ID,
  529. TPCI200_SUBDEVICE_ID },
  530. { 0, },
  531. };
  532. MODULE_DEVICE_TABLE(pci, tpci200_idtable);
  533. static struct pci_driver tpci200_pci_drv = {
  534. .name = "tpci200",
  535. .id_table = tpci200_idtable,
  536. .probe = tpci200_pci_probe,
  537. .remove = tpci200_pci_remove,
  538. };
  539. module_pci_driver(tpci200_pci_drv);
  540. MODULE_DESCRIPTION("TEWS TPCI-200 device driver");
  541. MODULE_LICENSE("GPL");