fdomain_pci.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/module.h>
  3. #include <linux/pci.h>
  4. #include "fdomain.h"
  5. static int fdomain_pci_probe(struct pci_dev *pdev,
  6. const struct pci_device_id *d)
  7. {
  8. int err;
  9. struct Scsi_Host *sh;
  10. err = pci_enable_device(pdev);
  11. if (err)
  12. goto fail;
  13. err = pci_request_regions(pdev, "fdomain_pci");
  14. if (err)
  15. goto disable_device;
  16. err = -ENODEV;
  17. if (pci_resource_len(pdev, 0) == 0)
  18. goto release_region;
  19. sh = fdomain_create(pci_resource_start(pdev, 0), pdev->irq, 7,
  20. &pdev->dev);
  21. if (!sh)
  22. goto release_region;
  23. pci_set_drvdata(pdev, sh);
  24. return 0;
  25. release_region:
  26. pci_release_regions(pdev);
  27. disable_device:
  28. pci_disable_device(pdev);
  29. fail:
  30. return err;
  31. }
  32. static void fdomain_pci_remove(struct pci_dev *pdev)
  33. {
  34. struct Scsi_Host *sh = pci_get_drvdata(pdev);
  35. fdomain_destroy(sh);
  36. pci_release_regions(pdev);
  37. pci_disable_device(pdev);
  38. }
  39. static struct pci_device_id fdomain_pci_table[] = {
  40. { PCI_DEVICE(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70) },
  41. {}
  42. };
  43. MODULE_DEVICE_TABLE(pci, fdomain_pci_table);
  44. static struct pci_driver fdomain_pci_driver = {
  45. .name = "fdomain_pci",
  46. .id_table = fdomain_pci_table,
  47. .probe = fdomain_pci_probe,
  48. .remove = fdomain_pci_remove,
  49. .driver.pm = FDOMAIN_PM_OPS,
  50. };
  51. module_pci_driver(fdomain_pci_driver);
  52. MODULE_AUTHOR("Ondrej Zary, Rickard E. Faith");
  53. MODULE_DESCRIPTION("Future Domain TMC-3260 PCI SCSI driver");
  54. MODULE_LICENSE("GPL");